gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:28:07 24 4
gpt4 key购买 nike

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

  • i686-w64-mingw32-g++ -g hello.cpp -o hello生成 native Windows PE32 可执行文件,

  • wineg++ -g hello.cpp -o hello产生 libwine包装对hello.exe + hello.exe.so .

我现在想要的就是在调试器( gdb 或它的接口(interface),如果可能的话)中启动文件,并在入口点 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 :到目前为止最远,从黑色控制台窗口开始,让我介入,但我的代码中的内容仍然是 ?? -ed 出和 WinMain (或任何包含该字符串的内容)未知

  • winedbg hello.exe (对于 wineg++ 的输出):程序完全加载,调试器在后台运行时挂起等待

  • 运行应用程序并将其附加到 winedbg :不符合目的(不允许我在入口点停止),但在其他方面的工作原理与最后两点类似(与 MinGW 的输出一起工作,但不显示 hello.exe 的任何内部结构,不完全使用 wineg++ 的输出)。

  • 阅读大量官方和非官方教程、错误报告、SO 问题...

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

最佳答案

调试在 Wine 下运行的程序的最简单方法是在其下运行全功能的 gdbserver。首先,需要安装所需的软件包,例如在 Debian 下:

    # apt install gdb-mingw-w64 gdb-mingw-w64-target

然后运行程序

    $ wine Z:/usr/share/win64/gdbserver.exe localhost:12345 myprogram.exe

最后,从另一个终端/屏幕窗口:

    $ 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

然后像往常一样正常调试,即可以完全访问调试信息和工作断点等。

特别是,运行 gdbserver 比使用 winedbg --gdb 效果要好得多,后者多年来似乎已经很糟糕了。

关于debugging - 如何在Linux上正确调试交叉编译的Windows代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39938253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com