gpt4 book ai didi

exec 调用后 gdb 调试过程

转载 作者:行者123 更新时间:2023-12-01 16:11:24 26 4
gpt4 key购买 nike

调用execle后,不知道如何调试。我查看了其他网站,有些网站建议使用 set fork-follow-mode child,这帮助我进入了 fork。然而,在 fork 之后,我退出到主函数,并且从未进入我正在执行的程序。

这是代码:

            } 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:

这不是代码。这是一段无法编译且毫无意义的代码片段。您也没有告诉您正在使用什么操作系统,或者您使用了哪些 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 中。

关于exec 调用后 gdb 调试过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28789458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com