Wir haben eine Multi-Prozess-Anwendung, bei der das Debuggen eines bestimmten untergeordneten Prozesses sich als schwierig erweist. Aufgrund von Messaging-Timeouts zwischen den Prozessen haben wir keine Zeit, gdb an das Ziel-Kind anzuhängen, also habe ich mich gefragt, ob ich einen Prozess über eine Systemtap-Sonde stoppen kann?Kann ein Prozess über eine Systemtap-Sonde gestoppt werden, sodass gdb angehängt werden kann?
Eine einfache Sonde sollte, glaube ich, benötigt werden, zB .:
probe process("exeName").mark("STOP_HERE")
{
force_sig(SIGSTOP, current);
}
Leider ist die oben nicht kompilieren ... irgendwelche Ideen?
Ich bin kein Experte systemtap, so ist dies nicht wahrscheinlich die beste Lösung, aber hier ist meine rohe Lösung für alle Interessierten:
#!/bin/stap -g
global gdbRunning = 0;
probe process(@1).mark(@2)
{
raise(%{ SIGSTOP %});
gdbCmd = sprintf("cgdb -- -q -ex 'thread find %d' %s %d", tid(), @1, pid());
if (gdbRunning == 0)
{
gdbRunning = 1;
printf("STOP PID %d TID %d [%s]\n", pid(), tid(), gdbCmd);
system(gdbCmd);
}
else
{
printf("STOP PID %d TID %d\n", pid(), tid());
}
}
Ich werde Ihnen empfehlen, Ihren Prozess mit Einzelkind-Prozess zu starten. Es wird einfacher sein, mit einem einzelnen Kind zu beginnen, anstatt mehrere zu erstellen, und dann einen Handler zu schreiben, um sie zu stoppen. –
Rachit Jain; Danke für den Vorschlag, aber das ist leider keine Option - es hätte die Dinge viel einfacher gemacht. Eine andere Alternative, die ich aus Interesse ausprobieren kann, ist lldb, die startet und viel schneller anhängen kann als gdb (aber ich halte mich an fches Antwort für den mo). – mrtimdog