GDB attach to a running process

Discussion in 'Mac Programming' started by jose.leitao, Oct 6, 2010.

  1. macrumors newbie

    Joined:
    Jul 31, 2010
    #1
    I'm studying system-level programming. I have a little program that uses fork() to create a new child process. I set a breakpoint after the creation of the child process using GDB. Then, I ran it (through GDB).

    With a new terminal window I check the processes id's using "ps -l -u my_username".
    With another terminal window I enter GDB, and enter the command "attach child_pid". Still, no problem. I set a breakpoint. But then, when I do "n" inside that GDB session, in order to run/debug the child process,I keep getting the error :"Cannot find bounds of current function".

    When I check again the processes PID's I notice that the child PPID changed to a different value than the Parent's original PID. I don't know if that's the problem.

    Hope someone can help me. I'm new at this, but I definitely want to learn more, and use MAC OS to do it.
     
  2. macrumors 6502

    Joined:
    Jun 22, 2010
    Location:
    @
    #2
    This works for me. (Mac OS X 10.6.4, gcc 4.2.1, gdb 6.3.50-20050815.)

    Code:
    #include <stdio.h>
    #include <unistd.h>
    
    int
    main(void)
    {
      pid_t pid = fork();
    
      if (pid == (pid_t)0)
        {
          volatile int flag = 0;  // use gdb to set non-zero to exit the loop
          unsigned counter = 0;
          while (!flag)
            {
              printf("child %u\n", counter);
              counter++;
              sleep(1);
            }
          printf("child exit\n");
        }
      else
        {
          printf("parent exit (child pid %d)\n", pid);
        }
    
      return 0;
    }
    
    Procedure:

    Code:
    $ gcc -g fork.c
    $ gdb a.out
    (gdb) b fork.c:23
    (gdb) r
    
    And, in a second terminal window (where PID was printed by fork.c or found from ps)

    Code:
    $ gdb a.out PID
    (gdb) b fork.c:17
    (gdb) c
    
    If the child exits then the child gdb session gets confused...

    Code:
    (gdb) set flag=1
    (gdb) c
    Continuing.
    ^CInterrupted while waiting for the program.
    Give up (and stop debugging it)? (y or n)
    
    ...but otherwise this works. Hope it helps :)
     
  3. thread starter macrumors newbie

    Joined:
    Jul 31, 2010
    #3
    I

    Thank you very much for your help!My (Windows/Ubuntu users) colleagues were messing around with me, saying that after all I couldn't make this course's project in MAC OSX =P. I'm glad that is all this features are working now, because debugging multiple processes can be needed!

    I guess I can't set a breakpoint in the "while(!flag)" to make the command "continue" work, do you know why? thanks again!
     

Share This Page