exec调用后的gdb调试过程

mrQ*_*RTY 3 gdb exec

调用后我不知道调试后的调试方法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.
          }
Run Code Online (Sandbox Code Playgroud)

我知道过程映像被exec调用替换了,但为什么我仍然退出到这个程序的main而不是进入totalsize程序?

Emp*_*ian 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;
}
Run Code Online (Sandbox Code Playgroud)

// 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;
}
Run Code Online (Sandbox Code Playgroud)

现在让我们编译所有并在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]
Run Code Online (Sandbox Code Playgroud)

注意GDB如何附加上面的新程序,因为follow-fork-mode告诉它.

parent 9832 waiting for 9851
process 9851 is executing new program: /tmp/echo
Run Code Online (Sandbox Code Playgroud)

请注意GDB如何注意到该进程正在执行新的二进制文件.

[Switching to process 9851]

Breakpoint 1, main (argc=3, argv=0x7fffffffe8d8) at echo.c:4
4         for (int i = 1; i < argc; ++i) {
Run Code Online (Sandbox Code Playgroud)

请注意,我们现在停在不同的位置 main.

  • "这是一个无法编辑和无意义的代码片段"意味着俄罗斯哈哈.人们还应该研究`follow-exec-mode`. (3认同)