exec 调用后的 gdb 调试过程
gdb debugging process after exec call
我不知道调用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 调用替换,但为什么我仍然退出到该程序的主程序而不是进入 totalsize
程序?
Here is the code:
那不是 代码。那是一段不可编译且毫无意义的代码片段。
您也没有说明 OS 您正在使用什么,或者您使用了哪些 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
。
我不知道调用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 调用替换,但为什么我仍然退出到该程序的主程序而不是进入 totalsize
程序?
Here is the code:
那不是 代码。那是一段不可编译且毫无意义的代码片段。 您也没有说明 OS 您正在使用什么,或者您使用了哪些 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
。