Jak programowo ustawić punkt przerwania w kodzie C lub C ++, który będzie działał dla GDB w systemie Linux?
To znaczy:
int main(int argc, char** argv)
{
/* set breakpoint here! */
int a = 3;
a++; /* In gdb> print a; expect result to be 3 */
return 0;
}
int main
raczej niżvoid main
.return 0
jest to jednak konieczne i to tylko hałas!Odpowiedzi:
Jednym ze sposobów jest zasygnalizowanie przerwania:
W C:
AKTUALIZACJA : MSDN stwierdza, że system Windows tak naprawdę nie obsługuje
SIGINT
, więc jeśli problemem jest przenośność, prawdopodobnie lepiej będzie używaćSIGABRT
.źródło
__debugbreak()
i NIE__debug_break()
, jak widać tutajW projekcie, nad którym pracuję, robimy to:
(W naszym przypadku chcieliśmy mocno się zawiesić, gdyby wydarzyło się to poza debugerem, generując raport o awarii, jeśli to możliwe. To jeden z powodów, dla których użyliśmy SIGABRT. Wykonanie tego przenośnie w systemach Windows, Mac i Linux wymagało kilku prób. Skończyło się na kilku #ifdefs, pomocnie skomentowane tutaj: http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66 .)
źródło
breakpoint()
funkcję do swojego programu (może być pusta lub po prostu zawierać instrukcję print) i dodaćbreak breakpoint
do swojego~/.gdbinit
.Patrząc tutaj , znalazłem następujący sposób:
Wydaje mi się to trochę hakerskie. Myślę, że działa to tylko w architekturze x86.
źródło
cl.exe
) nie obsługuje tej składni, ale używa innej składni.int 3
podnosi SIGTRAP.__asm__("int $3");
powinno działać:źródło
#define
to, żebym nie musiał pamiętać składni. Mam to rozsypane po całym kodzie, czasami zamiastassert()
, ponieważ zatrzymanie debiugera pozwala mi zbadać wszystkie zmienne i stos. I oczywiście, tak jak assert, nie muszę go usuwać w celu uzyskania kodu produkcyjnegoRozczarowujące jest widzieć tak wiele odpowiedzi, które nie używają dedykowanego sygnału dla programowych punktów przerwania
SIGTRAP
:źródło
Na OS X możesz po prostu zadzwonić
std::abort()
(może być tak samo w systemie Linux)źródło