如何让gdb跟随execv?尽管“跟随执行模式”不工作

时间:2012-05-20 06:15:56

标签: c debugging gdb execv

我写了两个简单的程序:

int main(int ac, char **argv ) {
    execv( "/home/me/Desktop/execvtest2", argv );
}

int main(int ac, char **argv ) {
    execv( "/home/me/Desktop/execvtest1", argv );
}

我用它们编译了它们 gcc -g到相应的输出文件。 我使用gcc运行Ubuntu 10.10(Ubuntu / Linaro 4.4.4-14ubuntu5.1)4.4.5。

当我使用GNU gdb(GDB)7.2-ubuntu调试第一个程序时,我可以直到第一个execv语句,但随后这两个文件继续运行。即使我将follow-exec-mode设置为new,我也无法进入第二个程序。 当我设置catch exec时,gdb会在每次调用execv时停止(某些如何没有第二个程序的链接源,并且我无法退出gdb,因为它有点挂起!?)但是我无法将调用转入“新”(作为exec替换过程)下级程序。

那怎么办呢?必须有一种方法可以进入新的流程吗?我做错了吗?

干杯

2 个答案:

答案 0 :(得分:6)

你可以使用“catch”命令。 这将给你机会提出一些突破点 在你执行后

答案 1 :(得分:2)

我一直在做一些非常类似于你为我的课程做的事情。这有点hackish,如果你试图得到像寄存器值这样的东西,它可能会搞砸了。根据{{​​3}},您可以在维护执行文件的同时更改符号文件。为此,只需使用命令symbol-file file2即可。 请注意,这必须是使用GDB标志(GCC中的-g)编译的二进制文件。加载此符号文件后,您将无法断开或查看原始执行文件的任何行。但是,您可以为新符号文件设置断点,即break file2.c:40,然后像以前一样逐步执行。它有点hackish并且可能无法正常工作,因为您实际上是捕获新进程的执行并将其映射到它的二进制文件的符号表,而不使用该二进制文件直接运行它。我没有出色的结果,但你可以通过这种方式看到中间值。 另外,为了返回调试原始文件,您必须执行symbol-file file重新加载它的符号表。