如何在 linux 上正确调试交叉编译的 Windows 代码?
How to properly debug a cross-compiled Windows code on linux?
我有一小段 Windows 代码,基本上是从 MSDN tutorial 复制的,但适用于 C++。我现在可以使用以下方法之一编译它:
i686-w64-mingw32-g++ -g hello.cpp -o hello
生成本机 Windows PE32 可执行文件,
wineg++ -g hello.cpp -o hello
生成 libwine
包装器对 hello.exe
+ hello.exe.so
.
我现在只想在调试器中启动文件(gdb
或如果可能的话,它的接口)并在入口点停止 WinMain
.我在这方面很失败。我尝试过的(注意:在下面,没有扩展名的 hello
是非常不寻常的 Windows 可执行文件):
wine /usr/i686-w64-mingw32/sys-root/mingw/bin/gdbserver.exe :2000 hello
后跟 target remote :2000
在本地 gdb
:根本找不到任何符号,所有内容都是 ??
跨越 10 个以上的堆栈帧
wine /usr/i686-w64-mingw32/sys-root/mingw/bin/gdb.exe hello
:挂起,不接受任何用户在命令行上的输入
gdb wine
后跟 run hello
:Missing separate debuginfos, use: dnf debuginfo-install wine-core-1.9.19-1.fc24.i686
,我这样做了,错误仍然存在
gdb hello.exe.so
:导致 SIGSEGV
修改 hello.exe
脚本,使其设置正确的环境但最终运行 gdb
:没有任何符号,??
无处不在
winedbg hello
带和不带 --gdb
:到目前为止最远,以黑色控制台开始 window并让我介入,但我的代码中的任何内容仍然 ??
-ed 并且 WinMain
(或任何包含该字符串的内容)未知
winedbg hello.exe
(对于wineg++
的输出):程序完全加载,调试器在后台运行时挂起等待它
运行 应用程序并在 winedbg
中附加到它:不符合目的(不允许我在入口点停止)但其他大部分工作像最后两点(适用于 MinGW
的输出,但不显示 hello.exe
的任何内部结构,根本不适用于 wineg++
的输出。
阅读大量官方和非官方教程、错误报告、SO 问题...
我什至不记得我尝试过的其他组合。肯定不会那么难吧?
看来我明白了。用编译命令行
i686-w64-mingw32-g++ -gstabs hello.cpp -o hello.exe
我可以运行
winedbg hello.exe
并在其命令行中,
break WinMain@16
cont
重要的选项是 -gstabs
而不是 -g
,winedbg
没有 --gdb
。我在阅读 this mailing list thread 后想通了,那里讨论了更多相关信息。
请注意,裸 winedbg
在名称修改等方面受到严重损害,但 gdb
将无法工作(至少不是开箱即用),原因如下 in the link above.
您可以 运行 winedbg --gdb --no-start progra.exe 。之后您可以使用 Hopper dissansambler 并附加到您获得的端口。
在 Wine 下调试程序 运行ning 的最简单方法是在其下 运行 全功能 gdbserver。首先,需要安装所需的包,例如在 Debian 下:
# apt install gdb-mingw-w64 gdb-mingw-w64-target
然后运行程序为
$ wine Z:/usr/share/win64/gdbserver.exe localhost:12345 myprogram.exe
最后,来自另一个 terminal/screen window:
$ x86_64-w64-mingw32-gdb myprogram.exe
(gdb) set solib-search-path ...directories with the DLLs used by the program...
(gdb) target extended-remote localhost:12345
然后像往常一样正常调试,即可以完全访问调试信息和工作断点等。
特别是,运行ning gdbserver
比使用 winedbg --gdb
效果好得多,后者似乎已损坏多年。
我有一小段 Windows 代码,基本上是从 MSDN tutorial 复制的,但适用于 C++。我现在可以使用以下方法之一编译它:
i686-w64-mingw32-g++ -g hello.cpp -o hello
生成本机 Windows PE32 可执行文件,wineg++ -g hello.cpp -o hello
生成libwine
包装器对hello.exe
+hello.exe.so
.
我现在只想在调试器中启动文件(gdb
或如果可能的话,它的接口)并在入口点停止 WinMain
.我在这方面很失败。我尝试过的(注意:在下面,没有扩展名的 hello
是非常不寻常的 Windows 可执行文件):
wine /usr/i686-w64-mingw32/sys-root/mingw/bin/gdbserver.exe :2000 hello
后跟target remote :2000
在本地gdb
:根本找不到任何符号,所有内容都是??
跨越 10 个以上的堆栈帧wine /usr/i686-w64-mingw32/sys-root/mingw/bin/gdb.exe hello
:挂起,不接受任何用户在命令行上的输入gdb wine
后跟run hello
:Missing separate debuginfos, use: dnf debuginfo-install wine-core-1.9.19-1.fc24.i686
,我这样做了,错误仍然存在gdb hello.exe.so
:导致 SIGSEGV修改
hello.exe
脚本,使其设置正确的环境但最终运行gdb
:没有任何符号,??
无处不在winedbg hello
带和不带--gdb
:到目前为止最远,以黑色控制台开始 window并让我介入,但我的代码中的任何内容仍然??
-ed 并且WinMain
(或任何包含该字符串的内容)未知winedbg hello.exe
(对于wineg++
的输出):程序完全加载,调试器在后台运行时挂起等待它运行 应用程序并在
winedbg
中附加到它:不符合目的(不允许我在入口点停止)但其他大部分工作像最后两点(适用于MinGW
的输出,但不显示hello.exe
的任何内部结构,根本不适用于wineg++
的输出。阅读大量官方和非官方教程、错误报告、SO 问题...
我什至不记得我尝试过的其他组合。肯定不会那么难吧?
看来我明白了。用编译命令行
i686-w64-mingw32-g++ -gstabs hello.cpp -o hello.exe
我可以运行
winedbg hello.exe
并在其命令行中,
break WinMain@16
cont
重要的选项是 -gstabs
而不是 -g
,winedbg
没有 --gdb
。我在阅读 this mailing list thread 后想通了,那里讨论了更多相关信息。
请注意,裸 winedbg
在名称修改等方面受到严重损害,但 gdb
将无法工作(至少不是开箱即用),原因如下 in the link above.
您可以 运行 winedbg --gdb --no-start progra.exe 。之后您可以使用 Hopper dissansambler 并附加到您获得的端口。
在 Wine 下调试程序 运行ning 的最简单方法是在其下 运行 全功能 gdbserver。首先,需要安装所需的包,例如在 Debian 下:
# apt install gdb-mingw-w64 gdb-mingw-w64-target
然后运行程序为
$ wine Z:/usr/share/win64/gdbserver.exe localhost:12345 myprogram.exe
最后,来自另一个 terminal/screen window:
$ x86_64-w64-mingw32-gdb myprogram.exe
(gdb) set solib-search-path ...directories with the DLLs used by the program...
(gdb) target extended-remote localhost:12345
然后像往常一样正常调试,即可以完全访问调试信息和工作断点等。
特别是,运行ning gdbserver
比使用 winedbg --gdb
效果好得多,后者似乎已损坏多年。