2013-07-16 21 views
5

Çalışan bir işlemin PID'sine eklenmiş gdb'nin olması ve programın belirli bir kesme noktasına ulaştığı her defasında gdb'nin stackframe'i harici bir dosyaya vermesi mümkün mü?Belirli bir kesme noktasında yığın çerçevesini yazdırmak için GDB'yi otomatikleştirin

this ve this'a baktım ancak gdb'yi zaten çalışan bir işleme eklemenin (gdb'yi başlatmak yerine) mümkün olup olmadığı konusunda hiçbir söz yok.

GID'ye gdb'yi ekleyebiliyorum, ancak bt'u çalıştırmak için otomatikleştirmek istiyorum, çıkışı harici bir dosyada saklamak ve continue'u çalıştırın. Şu anda bunu el ile yapıyorum ve bir kesme noktası her vurulduğunda bunu yapmak zorunda olduğumda bir acıdır.

+0

Tamam, bu oldukça doğrudan :) Sadece bir program başlattığında bazı komutları yürütmek için gdb'nin otomatikleştirilebileceği gibi görünüyordu ve çok çalışan bir pideyi inceleyebilirsiniz yeni başlattığınız gibi, mümkün olduğu gibi hissettim. – Nobilis

+0

Elbette gdb'yi çalışan bir sürece eklemek mümkün. Herhangi bir hata ayıklayıcının temel işlevi gereklidir. Adam gdb'yi denedin mi? Orada. –

+1

@Nobilis ve hatalıyım, bazı umut verici cevaplar aldınız –

cevap

4
Is it possible to have gdb attached to the PID of a running process?? 

Evet. Mümkün.

Güncel:

Adım 1: yılında

dosyası aşağıdaki komutu ekleyin .gdbinit,

define callstack 
    set $Cnt = $arg0 

    while($Cnt) 
     commands $Cnt 
     silent 
     bt 
     c 
     end 
     set $Cnt = $Cnt - 1 
    end 
end 

Adım 2: -x <path to .gdbinit file > ile gdb çağırır. PID'yi koşu işlemi için de unutmayın.

Adım 3: İhtiyacınız olan yere, kesme noktaları koyun.

Adım 4: Kullanıcı tanımlı komutunu callstack numaralı telefondan arayın ve hiçbir çakışma noktası geçmeyin.

gdb> callstack <No.of. Break Points> 

5. Adım: Şimdi devam etmek için 'c' değerini verin. Bcos işlemi zaten çalışıyor.

Kayıt için @ VoidPointer'ın yanıtını takip etmenizi öneriyorum. Benim için çalışıyor. Reference.

+0

Kaynağına erişebildiğimi ve programın gdb eklediğimde program hata ayıklama simgeleriyle derlendiğini açıklamalıyım , Kesme noktalarını özgürce kurabilirim, fonksiyonlara bir göz atabilirim, yığın çerçevesini yazdırırken tüm isimleri alırım vs. Bu herhangi bir fark yaratır mı? – Nobilis

+0

Yukarıdaki adımlar, işlem noktanızdaki tüm işlevlere kesme noktasını koydu. Bu fonksiyon isimleri 'function_names' dosyasında olacaktır. Toplama fonksiyon isimleri için, nesne dosyası, çalıştırılamaz olan 'nm' araçları kullanıyorum. Bu yüzden -c seçeneğini kullanarak nesne dosyaları oluşturmanız gerekir. – Jeyaram

+0

Sadece belirli bir satırda bir kesme noktası istiyorum, hata ayıklama sembollerine sahip olduğum için çizgiye erişebilir ve orada bir kesme noktası belirleyebilirim. Oradaki tüm fonksiyon isimlerine ihtiyacım yok. Sadece bir kesme noktası ayarlamak, orada backtrace çalıştırmak ve sonra bu çıktıyı saklamak mümkün mü? – Nobilis

3

ne gerek PID ve işlevlerini bilerek zaman o zaman bu deneyebilirsiniz gdb kullanarak yığın çerçevesi baskı otomatik hale getirmek için ise .. (Verilen minimum kod fonksiyonel olması)

/root/.gdb_init:

PID 6474 ve komut dosyası /root/.gdb_init için GDB çağırma
set pagination off 
set logging file gdb.txt 
set logging on 

br fun_convert 
# ^^ when breaking at function fun_convert, execute `commands` till next `end` 
commands 
    bt 
    print "Sample print command 1 \n" 
    continue 
end 

br file.c:451 
# ^^ when breaking at line 451 of file.c, execute from `commands` till next `end` 
commands 
    bt 
    print "Sample print command 2 \n" 
    continue 
end 

continue 

,

gdb -p 6474 -x /root/.gdb_init 

O Yeniden, fun_convert kırma işlevidir. Bu br gerçek break gdb komutudur ve br file.c:451 kullanarak herhangi bir dosya satırında da kırılabilir. Daha fazla break seçenekleri için gdb yardımını kontrol edin. Ilgili br için commands ve end arasında ihtiyacınız olan gdb komutlarını ekleyebilirsiniz. commands hakkında daha fazla bilgi için, gdb numaralı telefondan help commands'u kontrol edin.

Not: SO JS tarayıcımda bozuldu oluyor, herhangi bir hata affedip düzeltmek için çekinmeyin. Ayrıca yorum ekleyemezsiniz :(

+0

Harika, bunu komut satırından nasıl çalıştırırım, üzgünüm? Ayrıca, bu ayarlandığım kesme noktasına mı, yoksa fun_convert'a ne zaman denir? – Nobilis

+0

Mesela 'b fun_convert' yerine' 451' yapabilirim ki burada 451 satır numarasıdır? – Nobilis

+0

Cevabınız için teşekkür ederim, Jeyaram'ın çözümünü benim için çalıştığından seçtim ama vermiş olduğum 'set' komutları için cevabınızı yedim :) – Nobilis

İlgili konular