2010-12-01 12 views
80

Linux'ta gdb için çalışacak C veya C++ kodu programatik olarak nasıl bir kesme noktası belirleyebilirim?C veya C++ kodlarında kesme noktası, gdb'de Linux için programatik olarak ayarlama

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

Bu benim için hackish bir dokunuş görünüyor:

yani .:

int main(int argc, char** argv) 
{ 
    /* set breakpoint here! */ 
    int a = 3; 
    a++; /* In gdb> print a; expect result to be 3 */ 
    return 0; 
} 
+7

Pek bir yan notu (Linux üzerinde aynı olabilir) çağırabilir, ancak taşınabilirlik ilgili endişeleriniz varsa o zaman da muhtemelen endişelendiğini doğruluk - yani 'ana ana' yerine 'ana'. –

+0

@Stuart - Sabit. Bunu bir süre önce yapmalıydım. –

+3

@ J.Polfer: '0' dönüşü gerekli değil ve sadece bir ses! –

cevap

77

bir yolu bir kesme sinyal olduğunu MSDN states, Windows gerçekten SIGINT desteklemediği taşınabilirliği bir endişe ise yani, SIGABRT'u kullanmanız daha iyi olur. . Bu kilitlenme raporu mümkünse üreten ayıklayıcıya dışında olmamış

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

(Bizim durumumuzda biz zor çökmesine istedi Yani kullandığımız sebeplerinden biri: Ben üzerinde çalışmak bir projede

+0

Bu daha taşınabilir, değil mi? –

+0

Evet, bu işletim sistemleri/derleyicileri/hata ayıklayıcıları arasında çalışmalıdır. –

+1

Diğer hata ayıklayıcılarını bilmiyorum, ancak gdb [sinyal işleme] konusunda oldukça esnektir (http://www.delorie.com/gnu/docs/gdb/gdb_39.html). – Cascabel

18

here seyir ederek, şu yol buldum. Ve bence bu sadece x86 mimarisinde çalışıyor. C

#include <csignal> 

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

:

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

UPDATE:

+3

Ve sadece AT & T montaj sözdizimini destekleyen derleyicilerle. Özellikle, Microsoft'un derleyici ('cl.exe') bu sözdizimini desteklemez, ancak farklı bir sözdizimi kullanır. –

+0

soru linux hakkındaydı, bu yüzden gcc sözdiziminin x86 için çalışacağını varsayabiliriz. –

+0

BTW - Yukarıdaki x86 makinemi denedim ve işe yaradı. Bunu yapmanın daha iyi bir yolu olup olmadığını merak ettim. Olduğu gibi görünüyor. –

25

, bunu ... SIGABRT portably Windows, Mac genelinde Bunu yapmak ve Linux çeşitli girişimlerde aldı Biz birkaç #ifdefs, yardımsever burada yorumladı ile sona erdi: http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66)

+2

Her zamanki gibi pencereler diğerlerine benzemiyor :) – mathk

+0

Programı duraklatılmış durumda programlamaya devam etmek için "sinyal 0" vermek mümkün mü? “N” veya “s” yi bu noktadan, 'c' verilmeden kullanabilmek güzel olurdu. –

+1

@JasonDoucette Programın duraklatılmasını gerçekten istiyorsanız, programınızda 'breakpoint()' fonksiyonunu eklemek isteyebilirsiniz (boş olabilir veya sadece bir print cümlesi içerebilir) ve 'break breakpoint'' e ekleyin ~/.gdbinit'. –

9

__asm__("int $3"); çalışması gerekir:

int main(int argc, char** argv) 
{ 
    /* set breakpoint here! */ 
    int a = 3; 
    __asm__("int $3"); 
    a++; /* In gdb> print a; expect result to be 3 */ 
    return 0; 
} 
OS X'te
+0

Harika, teşekkürler! – leishman

+1

Ben bunu "# define" yapmayı seviyorum, böylece sözdizimini hatırlamıyorum. Kodum boyunca, bazen de "assert()" yerine serpildi, çünkü debiugger'ı durdurduğumdan tüm değişkenleri ve yığını inceleyelim. Ve elbette, iddia gibi, üretim kodu için kaldırmak zorunda değilim – Mawg

1

sadece std::abort() (üzgün nitpick)

+0

Hangi kütüphane? – Alex

İlgili konular