调试子进程 - GDB/DDD

发布于 2024-11-03 05:15:37 字数 859 浏览 1 评论 0原文

我的项目是通过以 & 结束 arglist 的方式来实现一个带有后台处理的简单 shell 程序,就像在大多数 UNIX shell 中一样。我的问题是当后台处理需要创建子进程时如何调试GDB中的shell。

我的子处理代码就像

int id;
int child=-1;
int running=0;

if ((strcmp(args[0], "&")==0){

  if ((id==fork())==-1)
    perror("Couldn't start the background process");

  else if (id==0){  //start the child process
    running++;
    printf("Job %d started, PID: %d\n", running, getpid());
    signal(SIGINT, SIG_DFL);
    signal(SIGQUIT, SIG_DFL);
    execvp(args[0], args);
    perror("Can't execute command);
    exit(1);

  else {
    int jobNum= running-(running-1);

   if ( (waitpid(-1, &child, WNOHANG) == -1)
     perror("Child Wait");

   else 
     printf("[%d] exited with status %d\n", jobNum, child>>8);
}

当我尝试运行命令(如 ps &)并将断点设置为函数解析器时,该命令执行时不会遇到断点。这很令人困惑,并且使调试器在这种情况下毫无用处。我能做什么呢?

My project is to implement a simple shell program with background processing by way of ending an arglist with &, as in most UNIX shells. My problem is how to debug the shell in GDB when background processing requires child processes to be created.

My child processing code goes like

int id;
int child=-1;
int running=0;

if ((strcmp(args[0], "&")==0){

  if ((id==fork())==-1)
    perror("Couldn't start the background process");

  else if (id==0){  //start the child process
    running++;
    printf("Job %d started, PID: %d\n", running, getpid());
    signal(SIGINT, SIG_DFL);
    signal(SIGQUIT, SIG_DFL);
    execvp(args[0], args);
    perror("Can't execute command);
    exit(1);

  else {
    int jobNum= running-(running-1);

   if ( (waitpid(-1, &child, WNOHANG) == -1)
     perror("Child Wait");

   else 
     printf("[%d] exited with status %d\n", jobNum, child>>8);
}

When I try to run a command, like ps &, and set the breakpoint to the function parser, the command executes without hitting the breakpoint. This is confusing and renders the debugger useless in this instance. What can I do about it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

眼泪淡了忧伤 2024-11-10 05:15:37

我想您还想

set follow-fork-mode child

注意该行

if ((id==fork())==-1)

正在将未初始化的值与 fork() 的返回值进行比较。
我相信你想要一份任务。

I think you want

set follow-fork-mode child

also note that the line

if ((id==fork())==-1)

is comparing an uninitialized value against the return value of fork().
I believe you wanted an assignment.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文