如何在 linux 上正确调试交叉编译的 Windows 代码?

How to properly debug a cross-compiled Windows code on linux?

我有一小段 Windows 代码,基本上是从 MSDN tutorial 复制的,但适用于 C++。我现在可以使用以下方法之一编译它:

我现在只想在调试器中启动文件(gdb 或如果可能的话,它的接口)并在入口点停止 WinMain.我在这方面很失败。我尝试过的(注意:在下面,没有扩展名的 hello 是非常不寻常的 Windows 可执行文件):

我什至不记得我尝试过的其他组合。肯定不会那么难吧?

看来我明白了。用编译命令行

i686-w64-mingw32-g++ -gstabs hello.cpp -o hello.exe

我可以运行

winedbg hello.exe

并在其命令行中,

break WinMain@16
cont

重要的选项是 -gstabs 而不是 -gwinedbg 没有 --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 效果好得多,后者似乎已损坏多年。