GNU/Linux >> Znalost Linux >  >> Linux

Nastavte bod přerušení v kódu C nebo C++ programově pro gdb na Linuxu

Když jsem se podíval sem, našel jsem následující způsob:

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

Tohle mi připadá jako hloupé. A myslím, že to funguje pouze na architektuře x86.


Jedním ze způsobů je signalizovat přerušení:

#include <csignal>

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

V C:

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

AKTUALIZACE :Microsoft Docs říká, že Windows ve skutečnosti nepodporuje SIGINT , takže pokud jde o přenositelnost, pravděpodobně bude lepší použít SIGABRT .

SIGINT není podporován pro žádnou aplikaci Win32. Když dojde k přerušení CTRL+C, operační systémy Win32 vygenerují nový podproces, který toto přerušení konkrétně zpracuje. To může způsobit, že aplikace s jedním vláknem, například v systému UNIX, se stane vícevláknovou a způsobí neočekávané chování.


V projektu, na kterém pracuji, děláme toto:

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

(V našem případě jsme chtěli tvrdě havarovat, pokud se to stalo mimo ladicí program, a pokud to bylo možné, vygenerovat zprávu o havárii. To je jeden z důvodů, proč jsme použili SIGABRT. Přenositelnost na Windows, Mac a Linux zabrala několik pokusů. Nakonec jsme měli několik #ifdefs, užitečný komentář zde:http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66.)


Linux
  1. Nejlepší editory JavaScriptu pro Linux

  2. Nejlepší bezplatné hodiny pro Linux

  3. Získejte zdrojový kód pro jakýkoli příkaz Linux

  1. Příklad bodu přerušení GDB pro C – nastavení, zobrazení, pokračování a odstranění bodů přerušení

  2. Jak nastavit afinitu CPU pro proces z C nebo C++ v Linuxu?

  3. Nástroj pro porovnání kódu pro Linux

  1. 5 tipů pro GNU Debugger

  2. Ctrl + C přerušení zpracování událostí v Linuxu

  3. Linux:nastavení pro vzdáleného správce systému