Bagaimana cara menetapkan breakpoint dalam kode C atau C ++ secara terprogram yang akan berfungsi untuk gdb di Linux?
Yaitu:
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
daripadavoid main
.return 0
tidak perlu, dan hanya kebisingan!Jawaban:
Salah satu caranya adalah dengan memberi sinyal interupsi:
Di C:
UPDATE : MSDN menyatakan bahwa Windows tidak benar-benar mendukung
SIGINT
, jadi jika portabilitas menjadi perhatian, Anda mungkin lebih baik menggunakannyaSIGABRT
.sumber
__debugbreak()
dan BUKAN__debug_break()
, seperti yang Anda lihat di siniDalam proyek yang saya kerjakan, kami melakukan ini:
(Dalam kasus kami, kami ingin crash keras jika ini terjadi di luar debugger, menghasilkan laporan kerusakan jika memungkinkan. Itulah salah satu alasan kami menggunakan SIGABRT. Melakukan ini secara portabel di Windows, Mac, dan Linux membutuhkan beberapa upaya. Kami berakhir dengan beberapa #ifdefs, dengan senang hati berkomentar di sini: http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66 .)
sumber
breakpoint()
fungsi dalam program Anda (bisa kosong atau hanya berisi pernyataan print) dan menambahkanbreak breakpoint
ke Anda~/.gdbinit
.Dengan melihat di sini , saya menemukan cara berikut:
Ini sepertinya sentuhan hackish bagi saya. Dan menurut saya ini hanya berfungsi pada arsitektur x86.
sumber
cl.exe
) tidak mendukung sintaks ini, tetapi menggunakan sintaks yang berbeda.int 3
memunculkan SIGTRAP.__asm__("int $3");
harus bekerja:sumber
#define
ini, jadi saya tidak perlu terlalu mengingat sintaksnya. Saya memilikinya ditaburkan di seluruh kode saya, kadang-kadang di tempatassert()
, sejak menghentikan debiugger, mari saya periksa semua variabel & tumpukan. Dan, tentu saja, seperti menegaskan, saya tidak perlu menghapusnya untuk kode produksiMengecewakan untuk melihat begitu banyak jawaban tidak menggunakan sinyal khusus untuk breakpoints software,
SIGTRAP
:sumber
Di OS X Anda bisa menelepon
std::abort()
(mungkin sama di Linux)sumber