在调用execle
后,我不知道如何在进程后调试。我查看了其他网站,有些建议使用set fork-follow-mode child
,这有助于我进入分支。然而,在fork之后,我退出到main函数,并且永远不会进入我正在执行的程序。
以下是代码:
} else if (!(pid_T2 = fork())) {
char **env = NULL;
char *units_env = NULL;
char *sleep_env = NULL;
size_t sleep_sz = 16;
env = (char **) malloc(3 * sizeof(char *));
sleep_env = (char *) malloc(sleep_sz * sizeof(char));
snprintf(sleep_env, sleep_sz, "TSTALL=%d", cmd_args->sleep_num);
if (cmd_args->kb) {
units_env = "UNITS=1";
} else {
units_env = "UNITS=0";
}
*(env) = units_env; *(env + 1) = sleep_env; *(env + 2) = "TMOM=0";
/*printf("%s %s\n", *(env), *(env + 1));*/
close(pipe_A2toT2[1]);
dup2(pipe_A2toT2[0], 0);
close(pipe_A2toT2[0]);
execle("totalsize", "totalsize", NULL, env); //Exits to main after this line, never goes into program.
}
我知道过程映像被exec调用替换了,但为什么我仍然退出到这个程序的main而不是进入totalsize
程序?
答案 0 :(得分:6)
以下是代码:
那不是 代码。这是一个无法编译且无意义的代码片段。 您也没有告诉您使用的是哪种操作系统,或者您使用的是哪种GDB命令。
这是一个示例,展示了假设如何在Linux上运行
// echo.c
#include <stdio.h>
int main(int argc, char *argv[0]) {
for (int i = 1; i < argc; ++i) {
if (i != 1) printf(" ");
printf("%s", argv[i]);
}
printf("\n");
return 0;
}
// exec.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
pid_t pid = fork();
int status;
if (pid == 0) {
execlp("./echo", "echo", "aa", "bb", (char*)0);
abort();
} else {
printf("parent %d waiting for %d\n", getpid(), pid);
waitpid(pid, &status, 0);
printf("child %d exited %d\n", pid, status);
}
return status;
}
现在让我们编译所有并在GDB下运行:
gcc -g -std=c99 -o echo echo.c
gcc -g -o exec exec.c
gdb -q ./exec
Reading symbols from ./exec...done.
(gdb) set follow-fork-mode child
(gdb) break main
Breakpoint 1 at 0x4006a5: file exec.c, line 9.
(gdb) run
Starting program: /tmp/exec
Breakpoint 1, main () at exec.c:9
9 pid_t pid = fork();
(gdb) c
Continuing.
[New process 9851]
注意GDB如何附加上面的新程序,因为follow-fork-mode
告诉它。
parent 9832 waiting for 9851
process 9851 is executing new program: /tmp/echo
请注意GDB如何注意到该进程正在执行新的二进制文件。
[Switching to process 9851]
Breakpoint 1, main (argc=3, argv=0x7fffffffe8d8) at echo.c:4
4 for (int i = 1; i < argc; ++i) {
请注意,我们现在停在不同的 main
。