exec调用后的gdb调试过程

时间:2015-03-01 02:33:44

标签: 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.
          }

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

1 个答案:

答案 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