Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让gdb跟随execv?不工作,尽管;“遵循执行模式”;_C_Debugging_Gdb_Execv - Fatal编程技术网

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

如何让gdb跟随execv?不工作,尽管;“遵循执行模式”;,c,debugging,gdb,execv,C,Debugging,Gdb,Execv,我编写了两个简单的程序: int main(int ac, char **argv ) { execv( "/home/me/Desktop/execvtest2", argv ); } 及 我已经用 gcc-g到相应的输出文件。 我正在使用gcc(Ubuntu/Linaro4.4.4-14ubuntu5.1)4.4.5运行Ubuntu10.10 当我使用GNU gdb(gdb)7.2-ubuntu调试第一个程序时,我可以逐步执行直到第一个execv语句,但随后这两个文件就一直在运行。

我编写了两个简单的程序:

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

我已经用 gcc-g到相应的输出文件。 我正在使用gcc(Ubuntu/Linaro4.4.4-14ubuntu5.1)4.4.5运行Ubuntu10.10

当我使用GNU gdb(gdb)7.2-ubuntu调试第一个程序时,我可以逐步执行直到第一个execv语句,但随后这两个文件就一直在运行。即使我将follow exec模式设置为new,我也无法进入第二个程序。 当我设置catch exec时,gdb在每次调用execv时都会停止(第二个程序没有链接的源代码,我无法退出gdb,因为它有点挂起!?),但我无法跨过调用进入“新”(因为exec替换了进程)程序

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

干杯

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

您使用的是哪个操作系统,哪个
gcc
版本?我刚刚使用
gcc
版本
(Debian 4.4.5-8)4.4.5
,对其进行了测试,在第2行设置一个断点,然后在两个可执行文件中交替看到
gdb
很好的断点。顺便说一句:用于此测试的
gcc
(上面提到的版本)现在不知何故没有关于
follower exec mode
。我很惊讶这个答案没有获得更多投票。工作起来很有魅力!
int main(int ac, char **argv ) {
    execv( "/home/me/Desktop/execvtest1", argv );
}