GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Legen Sie Haltepunkte in C- oder C++-Code programmgesteuert für gdb unter Linux fest

Als ich hier nachsah, fand ich den folgenden Weg:

void main(int argc, char** argv)
{
    asm("int $3");
    int a = 3;
    a++;  //  In gdb> print a;  expect result to be 3
}

Das scheint mir ein bisschen hackish zu sein. Und ich denke, das funktioniert nur auf x86-Architektur.


Eine Möglichkeit besteht darin, einen Interrupt zu signalisieren:

#include <csignal>

// Generate an interrupt
std::raise(SIGINT);

In C:

#include <signal.h>
raise(SIGINT);

AKTUALISIEREN :Microsoft Docs sagt, dass Windows SIGINT nicht wirklich unterstützt , wenn Portabilität ein Problem darstellt, sind Sie wahrscheinlich besser dran, wenn Sie SIGABRT verwenden .

SIGINT wird für keine Win32-Anwendung unterstützt. Wenn ein STRG+C-Interrupt auftritt, generieren Win32-Betriebssysteme einen neuen Thread, um diesen Interrupt speziell zu behandeln. Dies kann dazu führen, dass eine Singlethread-Anwendung, wie z. B. eine in UNIX, multithreaded wird und unerwartetes Verhalten verursacht.


In einem Projekt, an dem ich arbeite, machen wir Folgendes:

raise(SIGABRT);  /* To continue from here in GDB: "signal 0". */

(In unserem Fall wollten wir hart abstürzen, wenn dies außerhalb des Debuggers passiert, und nach Möglichkeit einen Absturzbericht erstellen. Das ist einer der Gründe, warum wir SIGABRT verwendet haben. Um dies portabel über Windows, Mac und Linux zu machen, waren mehrere Versuche erforderlich. Am Ende hatten wir ein paar #ifdefs, hier hilfreich kommentiert:http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66 .)


Linux
  1. Code-Vergleichstool für Linux

  2. Strg + C Interrupt-Ereignisbehandlung in Linux

  3. So legen Sie die Prozess-ID in Linux für ein bestimmtes Programm fest

  4. Stellen Sie Systemdatum und -zeit mit C++ unter Linux ein

  5. Linux:für Remote-Systemadministrator eingerichtet

3 Kommandozeilen-Tools zum Vortäuschen von Produktivität

Linux-Chage-Befehl zum Festlegen der Kennwortalterung für Benutzer

10+ beste Python-IDEs für Linux

Dropbox für einen Linux Cloud Server eingerichtet

So richten Sie einen Linux-Killswitch für VPNs ein

Wie kann ich C++-Code profilieren, der unter Linux ausgeführt wird?