Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

mode.release win下 不产生pdb文件 #907

Closed
ranwei1025 opened this issue Jul 30, 2020 · 33 comments
Closed

mode.release win下 不产生pdb文件 #907

ranwei1025 opened this issue Jul 30, 2020 · 33 comments
Milestone

Comments

@ranwei1025
Copy link

测试了当前最新版本的xmake
xmake create test
xmake build test
release模式下 只产生了test.exe 应该产生对应的pdb文件

@waruqi
Copy link
Member

waruqi commented Jul 30, 2020

mode.release 规则不会生成任何符号文件,如果要生成,请用 mode.releasedbg

add_rules("mode.releasedbg")
target("test")
    ...
xmake f -m releasedbg
xmake

或者自己通过set_symbols("debug")启用

if is_mode("release") then
    set_symbols("debug")
end

@ranwei1025
Copy link
Author

xmake f -m releasedbg
xmake
这样不行 产生不了

if is_mode("release") then
set_symbols("debug")
end
这样可以 但产生的exe文件 不是release优化 完全和debug一样

@ranwei1025
Copy link
Author

需要实现的vs一样的效果 即是release优化 并能产生pdb文件

@waruqi
Copy link
Member

waruqi commented Jul 30, 2020

xmake f -m releasedbg
xmake
这样不行 产生不了

仔细看前面说明,要先配置add_rules("mode.releasedbg")

这样可以 但产生的exe文件 不是release优化 完全和debug一样

不会,你那里看出来跟debug完全一样了? set_symbols("debug")仅仅只是追加生成pdb,并不影响编译优化

@ranwei1025
Copy link
Author

配置了 add_rules("mode.releasedbg") 还是不产生pdb

没有ida看 release下汇编 只是看了文件大小 完全一样

@waruqi
Copy link
Member

waruqi commented Jul 30, 2020

配置了 add_rules("mode.releasedbg") 还是不产生pdb

没有ida看 release下汇编 只是看了文件大小 完全一样

xmake f -m releasedbg
checking for the architecture ... x64
checking for the Microsoft Visual Studio (x64) version ... 2019

Y:\test>xmake -rv
checking for the link.exe ... C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.27.29109\bin\HostX64\x64\link.exe
checking for the linker (ld) ... link.exe
checking for the c++ compiler (cxx) ... cl.exe
checking for the C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Tools\MSVC\14.27.29109\bin\HostX64\x64\cl.exe ... ok
checking for the flags (-Zi -FS -Fd) ... ok
checking for the flags (-Ox -fp:fast) ... ok
checking for the ccache ... no
[ 50%]: compiling.releasedbg src\main.cpp
"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Preview\\VC\\Tools\\MSVC\\14.27.29109\\bin\\HostX64\\x64\\cl.exe" -c -FS -Zi -Fdbuild\windows\x64\releasedbg\compile.test.pdb -Ox -fp:fast -nologo -Fobuild\.objs\test\windows\x64\releasedbg\src\main.cpp.obj src\main.cpp
checking for the flags (/sourceDependencies C:\Users\ruki\AppData\Local\Temp\.xmake\200730\_ADB0D9F01E9C4C3080631FFAA3FA4A40.json) ... ok
[ 75%]: linking.releasedbg test.exe
"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Preview\\VC\\Tools\\MSVC\\14.27.29109\\bin\\HostX64\\x64\\link.exe" -debug -pdb:build\windows\x64\releasedbg\test.pdb -nologo -dynamicbase -nxcompat -machine:x64 -out:build\windows\x64\releasedbg\test.exe build\.objs\test\windows\x64\releasedbg\src\main.cpp.obj
[100%]: build ok!

-pdb:build\windows\x64\releasedbg\test.pdb 这不是有么,你确定看的是 releasedbg 子目录?不会还是看的release目录吧。。

@ranwei1025
Copy link
Author

奇怪了
D:\temp\t>xmake f -v
configure
{
ccache = true
cc = cl.exe
mode = releasedbg
ndk_stdcxx = true
host = windows
ld = link.exe
plat = windows
kind = static
buildir = build
vs = 2017
wdk = d:\cc\wdk\Program Files\Windows Kits\10
arch = x64
}

D:\temp\t>xmake build -r -v
configure
{
ccache = true
ndk_stdcxx = true
cc = cl.exe
mode = releasedbg
host = windows
plat = windows
ld = link.exe
kind = static
buildir = build
vs = 2017
wdk = d:\cc\wdk\Program Files\Windows Kits\10
arch = x64
}
[ 0%]: compiling.releasedbg src\main.c
cl.exe -c -nologo -Fobuild\.objs\t\windows\x64\releasedbg\src\main.c.obj
src\main.c
[100%]: linking.releasedbg t.exe
link.exe -nologo -dynamicbase -nxcompat -machine:x64 -out:build\windows\x64\r
eleasedbg\t.exe build\.objs\t\windows\x64\releasedbg\src\main.c.obj
build ok!👌

@ranwei1025
Copy link
Author

刚还把 配置目录 .xmake 删除 再次重新配置 还是releasedbg 不产生pdb

@ranwei1025
Copy link
Author

-- add modes: debug and release
add_rules("mode.debug", "mode.release", "mode.releasedbg")
-- add target
target("t")
-- set kind
set_kind("binary")
-- add files
add_files("src/*.c")
if is_mode("release") then
set_symbols("debug")
end

@waruqi
Copy link
Member

waruqi commented Jul 30, 2020

$ xmake f -m releasedbg -cvD
$ xmake -rvD

执行下上面的命令,给我个完整的output看下, 另外xmake.lua上面的完整么

@ranwei1025
Copy link
Author

D:\temp\t>xmake f -m releasedbg -c -v -D
checking for the architecture ... x64
checking for the vswhere.exe ... C:\Program Files (x86)\Microsoft Visual Studio
Installer\vswhere.exe
checking for the cl.exe ... ok
checking for the Microsoft Visual Studio (x64) version ... 2017
configure
{
arch = x64
ccache = true
clean = true
plat = windows
ndk_stdcxx = true
host = windows
kind = static
buildir = build
vs = 2017
wdk = d:\cc\wdk\Program Files\Windows Kits\10
mode = releasedbg
}

D:\temp\t>xmake -r -v -D
configure
{
arch = x64
ccache = true
clean = true
plat = windows
host = windows
ndk_stdcxx = true
kind = static
buildir = build
vs = 2017
wdk = d:\cc\wdk\Program Files\Windows Kits\10
mode = releasedbg
}
checking for the link.exe ... ok
checking for the linker (ld) ... link.exe
checking for the c compiler (cc) ... cl.exe
checking for the ccache ... no
[ 0%]: compiling.releasedbg src\main.c
cl.exe -c -nologo -Fobuild\.objs\t\windows\x64\releasedbg\src\main.c.obj
src\main.c
[100%]: linking.releasedbg t.exe
link.exe -nologo -dynamicbase -nxcompat -machine:x64 -out:build\windows\x64\r
eleasedbg\t.exe build\.objs\t\windows\x64\releasedbg\src\main.c.obj
build ok!👌

@waruqi
Copy link
Member

waruqi commented Jul 30, 2020

xmake.lua 也完整发我下呢

@ranwei1025
Copy link
Author

工程使用 xmake create t 创建的默认例子

xmake.txt

@waruqi
Copy link
Member

waruqi commented Jul 30, 2020

cl.exe -c -nologo -Fobuild.objs\t\windows\x64\releasedbg\src\main.c.obj

不对,你确定用的是最新版本xmake? 执行下 xmake --version看看呢?

从2.3.6开始,vs编译器我会用全路径,不可能还是只有cl.exe。。。

你是不是装了两个xmake,一个在 program files 一个在 program files (x86),然后用的还是老的版本?

@ranwei1025
Copy link
Author

果然 之前装过一个老版本 后面安装新版本 以为会覆盖
D:\temp\t>xmake --version
xmake v2.2.8+201908261502, A cross-platform build utility based on Lua

@waruqi
Copy link
Member

waruqi commented Jul 30, 2020

理论上是会覆盖,具体为啥没覆盖 我回头查下安装脚本,可能是最近迁移到github action ci上做的安装包,里面判断x86/x64失效了,所以64的包也装到 program files (x86)目录

@ranwei1025
Copy link
Author

新版本可以了 release下 也是产生pdb的 但名字是 compile.t.pdb 应用名t.exe 应该t.pdb 更合适

@waruqi
Copy link
Member

waruqi commented Jul 30, 2020

compile.t.pd

这个是编译obj的中间pdb文件,不用管它,实际最终还有个 t.pdb的。link之后。

@ranwei1025
Copy link
Author

releasedbg 产生的exe 还是没有优化 看了下文件和debug exe一样大
release 产生的exe是优化的 但只有 compile.t.pdb 没有t.pdb
想要的是 优化t.exe 产生的pdb

@waruqi
Copy link
Member

waruqi commented Jul 30, 2020

releasedbg 产生的exe 还是没有优化 看了下文件和debug exe一样大
release 产生的exe是优化的 但只有 compile.t.pdb 没有t.pdb
想要的是 优化t.exe 产生的pdb

你不能光看大小,你对比下 xmake -v的完整编译flags么。。都是-Ox优化,releasedbg下唯一的区别就是:

  1. -FS -Zi -Fdbuild\windows\x64\releasedbg\compile.test.pdb 用来生成pdb
  2. link阶段多了个 /debug 用于可执行文件中注入调试信息,并关联对应的pdb文件

其他两者的编译和link的flags完全一摸一样了。。而影响可执行程序大小的就是这个 /debug 选项。。这仅仅只是注入调试信息。。程序本身运行还是优化过的。。不能说大小不同 变大了 就是没优化的。。

你可以 看下/debug的文档 https://docs.microsoft.com/en-us/cpp/build/reference/debug-generate-debug-info?view=vs-2019

这个flags并不影响优化,如果你去掉,确实会小,跟release的大小一致,但是可执行程序跟pdb没有关联了,我估计调试器也不会自动认你生成的pdb了,那你生成的pdb调试器不认,又有啥用呢?

An executable (.exe file or DLL) created for debugging contains the name and path of the corresponding PDB. The debugger reads the embedded name and uses the PDB when you debug the program. The linker uses the base name of the program and the extension .pdb to name the program database, and embeds the path where it was created. To override this default, set /PDB and specify a different file name.

@ranwei1025
Copy link
Author

这个对比了vs hello的例子 debug大小 35kb release大小 8kb
感觉这里面 还是那里没有配置好

@waruqi
Copy link
Member

waruqi commented Jul 30, 2020

我刚上面不是说的很明白了么,就多了个/debug 咋说不明白呢。。 你自己 xmake -v 对下 release/releasedbg的 flags么。。

@ranwei1025
Copy link
Author

您没有明白我的意思 其实希望xmake做到和vs一致的效果 这样才比较方便

@ranwei1025
Copy link
Author

release产生pdb 而不是releasedbg

@waruqi
Copy link
Member

waruqi commented Jul 30, 2020

release产生pdb 而不是releasedbg

首先,是否release产生pdb是用户的事情,xmake默认不处理编译模式,不管是release还是releasedbg对xmake而言,都是无所谓的。按理都是用户自己判断和设置,例如:

if is_mode("release") then
    set_optimize("fast")
    set_symbols("debug")
end 

如果不设置,默认最简单的工程,用户不管切那个mode,都是一样的效果,xmake不会自动追加什么设置

target("test")
    set_kind("binary")
    add_files("src/.c")

至于,add_rules("mode.release", "mode.releasedbg") 这些编译模式规则,仅仅只是为了方便用户不想自己通过 if is_mode("release") then自己判断设置,提供的一些常用的 编译规则而已,你可以不去应用。。

也可以自己定义自己的编译模式,比如xmake -f -m mymode,然后自己if is_mode("mymode")判断和设置自己需要的选项。

所以,对于内置的,mode.releasedbg等规则,仅仅只是辅助,并且是要跨平台一致的,并不是仅为了对齐某个特定平台的编译器,比如vs,目前mode.release规则的约定,就是不带符号信息,releasedbg才带。

如果内置的编译模式规则,满足不了用户需求,那就是用户需要自己配置的事情,不会因为某个用户说不方便,就改了,到时候另外一个用户说这样又不行,再去改回来。

@waruqi
Copy link
Member

waruqi commented Jul 30, 2020

所以你非要release有pdb,那就自己配置,也就三行代码:

if is_mode("release") then
    set_symbols("debug")
end 

如果觉得这三行都懒得配置,觉得不方便,那我也没办法,毕竟每个用户的需求都不同,每个需求,都去改内置的rules,永远不可能满足所有用户,xmake的初衷,就是提供了足够的灵活,用户可以自己定制。

@ranwei1025
Copy link
Author

下面这样 可以接受
if is_mode("release") then
set_symbols("debug")
end
但产生的exe文件 相同的代码 对比vs还是较大
是不是 /debug vs在release连接阶段没有使用导致 如果是 那就说明没有/debug windbg等调试加载该pdb依然没有问题

@ranwei1025
Copy link
Author

也就是需要 set_symbols("debug") 能在连接阶段 不使用/debug
从而做的vs一样的执行文件大小

@waruqi
Copy link
Member

waruqi commented Jul 30, 2020

也就是需要 set_symbols("debug") 能在连接阶段 不使用/debug
从而做的vs一样的执行文件大小

不用/debug,link完连pdb都不会生成,vs也都是带了的。。

你这里的问题,压根就不是 pdb的问题,跟生成pdb 跟/debug都没任何关系 , 是如何最小化编译的问题。。

你跟vs的命令对下么。。它link时候额外加了 /OPT:REF, /OPT:ICF,这两是做链接时优化用的。

/DEBUG changes the defaults for the /OPT option from REF to NOREF and from ICF to NOICF, so if you want the original defaults, you must explicitly specify /OPT:REF or /OPT:ICF.

只不过是带了/debug时候,默认vs给改了而已。你先自己通过 add_ldflags加下么

至于mode.xxx 的内置模式 我后期也会考虑改进下,但要过段时间了,你先自己根据自己的需求,缺啥flags,自己对着vs加呗,这跟xmake也没关系。。。自己缺啥flags就自己加啥flags

@ranwei1025
Copy link
Author

对的 就是这个问题
add_ldflags("/OPT:REF", "/OPT:ICF", {force = true})
导致release模式 产生的文件较大

@waruqi
Copy link
Member

waruqi commented Jul 30, 2020

那你就自己加下么,内置的 mode.release规则 是 fast优先 ,不是 size 优先,只有 mode.minsizerel 模式才是 minsize + release

@waruqi
Copy link
Member

waruqi commented Jul 31, 2020

这个我dev分支改进了下,只要带有 set_strip("all")配置,都会默认strip 所有unused refs codes,即使/debug被设置。

所以默认的release/minsizerel/releasedbg都会生效。。你可以直接采用下面的配置就行了

if is_mode("release") then
    set_symbols("debug")
end

或者直接使用mode.releasedbg规则都可以。。请更新到dev分支尝试:xmake update -s dev

@waruqi waruqi added this to the v2.3.7 milestone Jul 31, 2020
@waruqi
Copy link
Member

waruqi commented Jul 31, 2020

这个先这样吧,回头有问题再开新issues

@waruqi waruqi closed this as completed Jul 31, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants