1

I have a Python script that launches several external programs as subprocesses and uses pipes to communicate with them. The system runs on Linux. I want to debug one of the children, a specific executable program. How do I attach gdb to it? I have tried several methods but none work.

  1. Run python under gdb with set follow-fork-mode child. Doesn't work because this is not the only child. The first child gets debugged, rather than the one I want.
  2. Run python under gdb with set detach-on-fork off. Infeasible because this is not the only child. I need to manually tell gdb to continue debugging the parent process, until the program of interest is launched. Theoretically doable, but too much error-prone manual work. If all this manual work can be automated, this is a viable method.
  3. Replace the executable in question with a script that runs the original executable under gdb. Doesn't work because of pipes. Input and/or output of gdb get redirected to the pipe. I need them to go to the terminal obviously.

How can I accomplish this?

n. m. could be an AI
  • 112,515
  • 14
  • 128
  • 243

1 Answers1

1

How can I accomplish this?

You can attach a process without starting it from GDB, using gdb -p $pid. You may need to disable YAMA for this to work.

If your process crashes before you had a chance to attach it, this answer shows one way to debug such process.

Update:

Unfortunately inserting bits of code and rebuilding the program changes the behaviour.

In that case, mv $exe $exe.real, and put a wrapper executable in its place. The wrapper should be something like:

#include <unistd.h>

int main(int argc, char *argv[])
{
  char argv0[PATH_MAX];
  volatile int spin = 1;

  strcpy(argv0, argv[0]);
  strcat(argv0, ".real");

  while (spin) sleep(1);
  execvp(argv0, argv);  // Should not return

  abort();  // Unreachable
}

Attach GDB to the wrapper, set spin = 0 and continue to debug $exe.real.

Employed Russian
  • 199,314
  • 34
  • 295
  • 362
  • The program doesn't crash, it gives incorrect results. Unfortunately inserting bits of code and rebuilding the program changes the behaviour. I need to attach at the entrance to `main` or shortly thereafter but without changing it... – n. m. could be an AI Jan 31 '21 at 01:47