【问题标题】:How to properly debug a cross-compiled Windows code on linux?如何在 linux 上正确调试交叉编译的 Windows 代码?
【发布时间】:2017-02-17 16:38:18
【问题描述】:

我有一小段 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到目前为止最远,从黑色控制台窗口开始,让我介入,但我的代码中的内容仍然是 @ 987654344@-ed 和 WinMain(或包含该字符串的任何内容)未知

  • winedbg hello.exewineg++ 的输出):程序完全加载,调试器挂起等待它,而它已经在后台运行

  • winedbg 中运行应用程序并附加到它:不符合目的(不允许我停在入口点),但在其他方面主要像最后两点一样工作(与输出一起使用MinGW 的输出,但没有显示 hello.exe 的任何内部结构,完全不适用于 wineg++ 的输出)。

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

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

【问题讨论】:

    标签: debugging cross-compiling mingw32 wine


    【解决方案1】:

    看来我想通了。用编译命令行

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

    我可以跑

    winedbg hello.exe
    

    在它的命令行中,

    break WinMain@16
    cont
    

    重要的选项是 -gstabs 而不是 -g 和没有 --gdbwinedbg。我在阅读this mailing list thread 后发现了两者,那里讨论了更多相关信息。

    请注意,winedbg 在名称修改等方面受到严重损害,但由于in the link above 所述的原因,gdb 将无法工作(至少不是开箱即用)。

    【讨论】:

      【解决方案2】:

      调试在 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 效果好得多,winedbg --gdb 多年来似乎已经很糟糕了。

      【讨论】:

        【解决方案3】:

        您可以运行 winedbg --gdb --no-start progra.exe 。然后您可以使用 Hopper dissansambler 并附加到您获得的端口。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-14
          • 2018-01-14
          • 1970-01-01
          • 2011-05-18
          • 1970-01-01
          • 2022-01-03
          • 2017-05-24
          • 2023-04-02
          相关资源
          最近更新 更多