【问题标题】:How to compile C program in GCC to enable debug in WinDbg?如何在 GCC 中编译 C 程序以在 WinDbg 中启用调试?
【发布时间】:2017-06-09 10:59:29
【问题描述】:

我通过 GCC (v7.1.0)(下面的命令行)编译此类代码。

int func()
{
    return 0x1234;
}

int main()
{
    func();
    return 0;
}

gcc .\001_simpleMain.c -O0 -m64 -g

编译后我运行 WinDbg (10.0),打开可执行文件 (Ctrl+E),程序正在加载。断点在启动过程中被击中,一切正常。 之后我想打开源代码(Ctrl+O)并尝试在 func 方法中放置断点。

WinDlg 告诉我:

*** 错误:模块加载完成,但无法为 G:\Examples\Gcc\a.exe 加载符号

为什么它不起作用?我应该更改编译参数吗?我的 CPU 是 AMD64

【问题讨论】:

  • 尝试使用gdb(如果可用)
  • Clang 具有 Microsoft 兼容模式,可将 CodeView 样式的调试信息发送到目标文件中。如果您随后将它们与 Microsoft 的 link.exe 链接,您将拥有 WinDBG 和其他 Windows 调试器所需的 PDB。但是请注意,Microsoft 兼容模式也有其他影响。 clang.llvm.org/docs/MSVCCompatibility.html

标签: c windows debugging gcc windbg


【解决方案1】:

由于您将 Windows 与 WinDbg 一起使用,因此您需要专有的 PDB files,其中包含来自 Microsoft 的调试器工具的调试信息。

GCC 将生成可供gdb 调试器(在Linux 中众所周知)使用的调试信息。

gcc -g:

以操作系统的本机格式(stabs、COFF、XCOFF 或 DWARF)生成调试信息。 GDB 可以使用这些调试信息。


如果您已经在使用 MinGW 或 Cygwin,则可以从那里使用 gdb,因为它在 MinGW/Cygwin 环境中可用。如果没有,则有几个适用于 Windows 的 gdb 实现可用。

【讨论】:

    【解决方案2】:

    根据@Andre Kampling's instructions 构建调试文件后,您首先需要convert them into PDB format。但即便如此,WinDbg 仍可能找不到它们。

    可执行文件有一些指向 PDB 文件的数据。由于您是在 Linux 上构建的,这将是您的 Windows 系统上不可用的 Linux 路径。

    因此,您需要正确地set up your symbol path,以便 WinDbg 知道您将它们放在哪里。

    基本上你需要

    0:000> .symfix c:\symbols
    

    对于微软的符号和

    0:000> .sympath+ c:\path\to\your\symbols
    

    然后指示 WinDbg 再次加载它们

    0:000> .reload /f
    0:000> ld*
    

    【讨论】:

    • 你提到的一般来说是正确的,但这并不能解决最初提出的问题。如前所述,带有-g选项的gcc/ g++会生成gdb可以理解的调试符号,据我所知,在windows上使用windbg是无法调试此类程序的。
    • @MaryamShabani:我添加了一个转换器的链接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2014-02-03
    • 1970-01-01
    • 2011-03-11
    相关资源
    最近更新 更多