Reputation: 1460
I'd like to attach gdb to a process where I can't easily control the startup of the process because it is run from inetd and where the process completes too fast to be able to attach to it once it starts.
What I'd like to do is insert a bit of code at the particular point that I want to start debugging. That code would ideally wait for the debugger to attach and then continue. I've tried with a sleep but it is then tricky to choose a delay long enough that I have time to catch it but short enough not to be a nuisance waiting for it to elapse after gdb is attached.
Is there any better choices of code to insert or to call for this purpose?
Upvotes: 6
Views: 4857
Reputation: 524
If you're on Linux, you can do:
#include <signal.h>
#include <unistd.h>
...
kill(getpid(), SIGSTOP);
where you put the kill()
on the line of your program that you want to pause at. Then run your program, wait for it to pause, attach gdb, and you'll be inside the kill()
function call. Type c
to continue (you may have do this more than once), and you'll be debugging out into the rest of your code.
This is not normally required; usually you would just do gdb --args your_program your_args
to avoid the hassle of running first, then attaching. But sometimes this trick comes in handy when you're debugging something like a plugin that runs inside of some other framework that you can't launch on the gdb
command line as shown above.
Upvotes: 0
Reputation: 3001
using namespace std;
using namespace std::this_thread;
using namespace chrono;
void waitForDebugger()
{
steady_clock::time_point tp1, tp2, tp3;
microseconds d1 = microseconds(10000);
microseconds d2 = microseconds(20000);
bool looped = false;
while (true)
{
sleep_for(d1);
tp1 = steady_clock::now();
if (looped && duration_cast<microseconds>(tp1 - tp3) > d2)
{
break;
}
sleep_for(d1);
tp2 = steady_clock::now();
if (looped && duration_cast<microseconds>(tp2 - tp1) > d2)
{
break;
}
sleep_for(d1);
tp3 = steady_clock::now();
if (looped && duration_cast<microseconds>(tp3 - tp2) > d2)
{
break;
}
looped = true;
}
}
Upvotes: 0
Reputation: 213385
What I'd like to do is insert a bit of code at the particular point that I want to start debugging.
I usually do it like this:
volatile int done = 0;
while (!done) sleep(1);
Attach GDB (you'll be inside sleep
). Do finish
, then set var done = 1
, and enjoy the rest of your debugging session ;-)
Upvotes: 12