8

我写了两个简单的程序:

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/Linaro 4.4.4-14ubuntu5.1) 4.4.5 运行 Ubuntu 10.10。

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

那么如何做到这一点呢?一定有办法进入新流程吧?难道我做错了什么?

干杯

4

2 回答 2

9

你可以使用“catch”命令。这将使您有机会在执行后放置一些断点

于 2012-09-12T04:55:20.563 回答
3

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

于 2014-02-18T21:11:38.257 回答