c语言 - 如何使 gdb 遵循执行?尽管"follow-exec-mode"仍然不起作用



我写了两个简单的程序:

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 语句,但随后两个文件继续运行。即使我将跟随执行模式设置为new,也无法进入第二个程序。当我设置 catch exec 时,gdb 在每次调用 execv 时都会停止(有些没有第二个程序的链接源,我无法退出 gdb,因为它有点挂起!?(,但我无法将调用跨入"新"(因为 exec 替换了进程(劣质程序。

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

干杯

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

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

相关内容

最新更新