使用gdb调试exe

Posted

技术标签:

【中文标题】使用gdb调试exe【英文标题】:debugging exe using gdb 【发布时间】:2016-05-20 06:23:59 【问题描述】:

在尝试了几种替代方法来调试 exe 相当不成功后,决定尝试 gdb 在 windows env 上调试可执行文件。

用于编译 exe 的选项如下所示

/nologo /Z7  /Zi /MT /W3 /GX /O2 /D /DEBUG

这些是我用来将可执行文件加载到 gdb 中的选项

target exec setup
run -debug ( this is the option against which I would like to perform some debugging)

我需要一种将源/符号加载到 GDB 中的方法,因为否则我无法设置任何有效的断点。

这是我尝试过的,为了设置断点(不同于通常的方式)

(gdb) set breakpoint pending on
(gdb) break runInstaller.c:6318
 No symbol table is loaded.  Use the "file" command.
 Breakpoint 2 (runInstaller.c:6318) pending.
 (gdb) pwd
 Working directory C:\
 (gdb) info b
  Num     Type           Disp Enb Address    What
  1       breakpoint     keep y   <PENDING>  WinMain
  2       breakpoint     keep y   <PENDING>  runInstaller.c:6318

我已经试过这个来加载可执行文件;

(gdb) file setup
 Reading symbols from setup...(no debugging symbols found)...done.

由于上述错误,我意识到可执行文件没有使用调试选项编译,所以它在 gdb 中有一个 gcc -g 等效项,或者有更好的方法将符号/源代码加载到 gdb 中。

编辑 1: 每当我尝试添加断点时,都会看到以下错误:

(gdb) b main_helper
 Function "main_helper" not defined.
 Make breakpoint pending on future shared library load? (y or [n]) y
 Breakpoint 5 (main_helper) pending.

【问题讨论】:

你提到的那些选项是用于 cl,而不是 gcc?如果是这样,为什么不使用 windbg 或 Visual Studio 中的调试器?他们可能在调试 Windows 二进制文件方面做得更好 @stijn 是的,我提到的选项适用于 CL 而不是 gcc,我曾尝试使用 windbg(意识到命令窗口正在显示我不理解的汇编级指令,因为未加载私有符号我无法在那里设置断点枯萎)gdb的舒适度略高。不幸的是,我们也有一个应该支持的 exe 文件 既然你有 cl,你可能也有 VS(除非你使用了那些全新的“只是 C++ 工具集”的东西之一)?我相当确定它的调试器的舒适度与 gdb 相似,只是它全部在 gui 中而不是在命令行中。 相关:The g++'s -g option equivalent to VS2010 cl compiler。它说cl-Zilink-debug 是需要的。与 setup.exe 文件在同一目录下是否有 pdb 文件? @MarkPlotnick 是的,我已将 pdb 文件添加到与可执行文件相同的目录中;即便如此,与上面报告的状态相比,我还是看到了任何差异 【参考方案1】:

您当前使用的安装文件没有调试所需的符号表。当您生成可执行二进制文件时,您还需要生成符号表。 前任。当我们为 c 程序生成可执行文件时,我们使用参数 -g 进行编译。

gcc setup.c -o setup -g 

-g 告诉 gcc 编译器生成符号表。

【讨论】:

是的,我知道这一点,但由于我使用的是 windows 编译器,我不确定 windows 中 gcc -g 的等效选项。 你使用的是哪个编译器? 我使用的是intel编译器

以上是关于使用gdb调试exe的主要内容,如果未能解决你的问题,请参考以下文章

在docker中使用gdb调试程序

如何在Docker内部使用gdb调试器

gdb调试程序函数名为问号,啥原因?

如何用gdb调试erlang运行期

使用gdb调试

Linux gdb调试