如何在 GCC 中编译 C 程序以在 WinDbg 中启用调试?

How to compile C program in GCC to enable debug in WinDbg?

我用 GCC (v7.1.0)(下面的命令行)编译这样的代码。

int func()
{
    return 0x1234;
}

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

gcc .[=11=]1_simpleMain.c -O0 -m64 -g

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

WinDlg 告诉我:

*** ERROR: Module load completed but symbols could not be loaded for G:\Examples\Gcc\a.exe

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

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

GCC 将生成 gdb 调试器(在 Linux 中广为人知)可以使用的调试信息。

gcc -g:

Produce debugging information in the operating system’s native format (stabs, COFF, XCOFF, or DWARF). GDB can work with this debugging information.


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

根据, you'll first need to convert them into PDB format 构建调试文件后。但即便如此,WinDbg 仍可能找不到它们。

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

因此,您需要 正确,以便 WinDbg 知道您将它们放在哪里。

基本上你需要

0:000> .symfix c:\symbols

用于 Microsoft 符号和

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

然后指示 WinDbg 再次加载它们

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