Etkileşimli hata ayıklama sırasında gdb çıktısını nasıl vurgulayabilir ve renklendirebilirim?


172

Lütfen cevap vermem ddd, nemiver, emacs, vim veya başka bir ön uç kullanmalıyım, sadece gdb'yi olduğu gibi tercih ederim, ancak çıktısını bazı terminal renkleriyle görmek istiyorum.


4
Size renk vermeyecektir (bu yüzden buna bir Cevap demeyeceğim), ancak bazı ~ / .gdbinit yapılandırması deneyimi geliştirecektir. Bunu çıplak bir minimum olarak kullanıyorum: geçmişe kaydetme
ayarını

Eski, yanlış cevabımın silinebilmesi için kabul edilen cevabı değiştirmek güzel olurdu. Teşekkürler.
ddaa

Üzerine vurgu güncel çizgi kez luygulanan alır sourceware.org/bugzilla/show_bug.cgi?id=21044 , sadece ekleyeceksiniz lbir etmek hook-stopve Dev Nirvana girin.
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

Yanıtlar:


183

.gdbinit

~/.gdbinitRenkleriniz için ayar yapabilirsiniz . .gdbinitBurada bulunan mammonları kullanabilirsiniz :

https://github.com/gdbinit/gdbinit

Siz de istediğiniz kadar ince ayar yapabilirsiniz. Bunu bu SO cevabı sayesinde buldum . İşte elde edebileceğiniz çıktı türü:

.gdbinit

Bir GitHub deposu da mevcuttur: https://github.com/gdbinit/Gdbinit

Bir yan notta, aynı fikir lldb'ye de uygulandı .

GDB Gösterge Tablosu

Aynı konsepti takiben GDB Dashboard , Python'daki GDB için modüler bir görsel arayüz sunar.

GDB Gösterge Tablosu

(Boşluk) yürüteç

Başka bir benzer proje daha fazla genişletilebilirlik sağlamak için GDB'nin Python desteğini kullanıyor, bu yüzden kontrol etmeye değer: https://github.com/dholm/voidwalker

@dholm, öncekinden esinlenerek kendi .gdbinit'ini de sağlar .

(Boşluk) yürüteç

pwndbg

Bazı projeler, iyileştirilmiş ekran da dahil olmak üzere bir dizi yararlı işlev sunar. Bu PEDA veya pwndbg için geçerlidir . İkincisi aşağıdaki açıklamayı verir:

Bir PEDA değişimi. Bizim iyi arkadaş ruhuna uygun olarak windbg, pwndbgtelaffuz edilir pwnd-bag.

  • hız
  • Esneklik
  • Kodu temizle

Hata ayıklamayı desteklemek ve PEDA'dan benzer şekilde geliştirmeyi ve daha iyi görüntüyü desteklemek için komutlar sağlar (bu, projenin ana odağı olmamasına rağmen). Yazılım hala geliştirilme aşamasındadır ve henüz doğru şekilde yayınlanmamıştır.

pwndbg

voltron

Proje açıklaması durumları:

Voltron, bilgisayar korsanları için genişletilebilir bir hata ayıklayıcı kullanıcı arayüzüdür. Diğer terminallerde çalışan yardımcı program görünümlerini hata ayıklayıcınıza (LLDB veya GDB) eklemenize olanak tanır, yine de size alıştığınız aynı hata ayıklayıcı CLI'sini verirken, sökme, yığın içeriği, kayıt değerleri vb.

Bunu .gdbinitotomatik olarak entegre etmek için değiştirebilirsiniz . Ancak, ekranın kendisi GDB'nin dışındadır (örneğin bir tmux bölünmesinde).

voltron

GEF

GEF başka bir seçenektir ve şöyle tanımlanır:

Dinamik analiz ve istismar geliştirme sürecinde yardımcı olmak için Python API kullanarak GDB'ye ek özellikler sağlamak için çoğunlukla sömürücüler ve tersine mühendisler tarafından kullanılması amaçlanmaktadır.

GEF


Cevabınız için çok teşekkürler, kayıt çıktısını nasıl kapatacağınız hakkında bir fikriniz var mı? (C ++ kodu için gdb kullanıyorum ve derhal montajcı düzeyine ihtiyacım yok)
vak

Evet. Lanet "Yorumlar en az 15 karakter uzunluğunda olmalı."
vak

1
@vak denedin set $SHOWCPUREGISTERS = 0mi Temel olarak ayarlayabileceğiniz birkaç parametreniz vardır ve kodu her zaman ihtiyaçlarınıza göre değiştirebilirsiniz.
BenC

100

Renkler değil, gdb'nin metin gui'sini düşünün . Gdb'nin kullanılabilirliği konusunda büyük bir fark yaratır.

Şununla başlatabilirsiniz:

gdb -tui executable.out

Ekran görüntüsü:

resim açıklamasını buraya girin

Gördüğünüz gibi, ana özellikler:

  • kaynağın hangi hattında olduğumuzu ve etrafındaki hatları gösterir
  • kesme noktalarını gösterir

5
Vaov! Teşekkürler! Gdb etrafında güzel bir grafik kabuk için uzun zamandır arıyordum ve xxgdb, kgdb ve ddd'yi denedim, ancak hiçbiri benim için çok iyi çalışmadı, bu yüzden düz eski komut satırı arayüzüne yapıştım. Ama bu kesinlikle mükemmel!
Thomas Padron-McCarthy

46
Ctrl-x Ctrl-a: Metin gui moduna geçmek ve bu moddan çıkmak için bunu girin, komut satırı seçeneği olmadan da çalışır.
jturcotte

2
Programdan stdout'a yazdırmak benim için arayüzü bozuyor. Yeniden yönlendirmenin yanı sıra herhangi bir geçici çözüm var mı?
Ciro Santilli 法轮功 9 病 六四 事件 法轮功

1
Ben stdout arayüzü kırma ile aynı sorunu alıyorum. Ctrl-L veya redraw bağlantınız ne olursa olsun, en azından kullanılabilir kılar. Vi düzenleme modu etkin olan kişiler için Ctrl-X Ctrl-A çalışmaz, ancak 'layout src' komutu sizi resim gibi gösterilen kaynakla TUI moduna geçirir.
wilywampa

1
İkinci bir terminal açın ve komutu verin: $ tty stdout'u gdb oturumundan bu terminale (gdb) set inferior-tty komutunu kullanarak yönlendirmek için sonucu kullanın. ex. benim .gdbinit aşağı-tty / dev / tty2 set şimdi stdout $ gdb -tui berbat olmaz.
netskink

46

Bir ön uç istemediğini biliyorum. Ama cgdb hakkında o gdb çok yakın, metin modu ama yukarıda kod üzerinde sözdizimi vurgu ile bir kaynak penceresi vardır.


2
sudo apt-get install cgdb
cs01

2
A real serendipity :)
Cahil

Sadece çalıştırmayı denedim: herhangi bir gdb geçmişi görmüyor ve ayrıca, caret ile sembolün yazıldığı gerçek yer arasında bazı boşlukların olduğu berbat bir istemi var (bu muhtemelen renkli bir istemim olduğu için gdb ) . Hiç etkilendim değil.
Hi-Angel

1
GDB Wiki'ye göre , cgdb, GDB ile etkileşimde bulunmak için kullanımdan kaldırılmış bir mekanizma kullanıyor .
Franklin Yu

1
Oh, terminal çıkış çöp hakkında bilinen sorun giderilmedi . Ne yazık ki sürdürücü bu soruyu cevaplamadı.
Franklin Yu

19

Renklerin kullanımı ile gdb'nin görünümünü büyük ölçüde arttırmak mümkündür. Bu, aşağıdaki yöntemlerden herhangi biri ile yapılır:

  1. "Set istemi" ile renklendirilmiş istem. Örneğin, istemi kalın ve kırmızı yapın:

    set prompt \033[1;31m(gdb) \033[m

    veya istemi kalın ve kırmızı olarak yeni bir şekil yapın:

    set prompt \033[01;31m\n\n#####################################> \033[0m

    resim açıklamasını buraya girin

  2. Kancalarla renklendirilmiş komutlar

  3. "Liste" komutunun renklendirilmiş sözdizimi vurgulaması.

Tüm örnekler Michael Kelleher tarafından yazılan aşağıdaki blog yazılarında mevcuttur:

"GDB'yi Güzelleştirin", 12 Mayıs 2010 (archive.org aracılığıyla)

"Deneysel GDB sözdizimi vurgulaması", 15 Mayıs 2010 (archive.org aracılığıyla)


14
Bağlantılar koptu.
John Carter

7
@Mike: Siteye artık erişilemediğinden ve robots.txt, archive.org'un dizine eklemesini engellediğinden, bu bağlantıların içeriklerini buraya göndermek yararlı olacaktır.
Lucian Adrian Grijincu

1
Burada gerekli bilgileri alabilirsiniz: sourceware.org/gdb/current/onlinedocs/gdb/Prompt.html
musiphil

1
Bağlantılar artık blog yazılarının bir archive.org önbelleğine yönlendiriliyor.
Alex Quinn

1
@Mike, blog yayınlarının yazarı olduğunuz anlaşılıyor; eğer öyleyse, cevabı açıklamalısınız.
David Z

13

Yaklaşan GDB 8.3'te yeni!

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=gdb/NEWS

Terminal stili artık CLI ve TUI için kullanılabilir. GNU Source Highlight ek olarak kaynak kod snippet'lerinin stilini sağlamak için de kullanılabilir. Daha fazla bilgi için aşağıdaki "stili ayarla" komutlarına bakın.

gdb ekran görüntüsü 8.2.91.20190401-23.fc30


Şimdiye kadar en iyi cevap! Burada gdb 8.3 medium.com/@simonconnah/… 'ı nasıl kuracağınıza dair bir öğretici bulabilirsiniz , makinenizin en az 512MB RAM'e ihtiyacı olduğunu unutmayın , aksi takdirde gccderleyici çöpe başlayacaktır.
kullanıcı

7
#into .gdbinit
shell mkfifo /tmp/colorPipe

define hook-disassemble
echo \n
shell cat /tmp/colorPipe | c++filt | highlight --syntax=asm -s darkness -Oxterm256 &
set logging redirect on
set logging on /tmp/colorPipe
end 

define hookpost-disassemble
hookpost-list
end 

define hook-list
echo \n
shell cat /tmp/colorPipe | c++filt | highlight --syntax=cpp -s darkness -Oxterm256 &
set logging redirect on
set logging on /tmp/colorPipe
end 

define hookpost-list
set logging off 
set logging redirect off 
shell sleep 0.1s
end 

define hook-quit
shell rm /tmp/colorPipe
end 

define re
hookpost-disassemble
echo \033[0m
end 
document re
Restore colorscheme
end 

Uyarı: Buggy. TUI desteği yok, 'kullanıcı modu' kesmek.

Burada ana kısmı buldum ve biraz değiştirdim. Vurgulama gerekiyor, c ++ filt. Renkler berbat olursa sorunu yeniden komutlayın.


7

cgdb daha iyidir gdb -tui


Kabul. Programım tarafından basılan basit çizgiler gdb -tui'nin konsolunu çöpe attı. Bu cgdb altında gerçekleşmez. Bahşiş için teşekkürler!
Randall Cook


4

Ben aşağıdaki gibi vurgulamak istedim: benim kaynak dosyaları (kütüphaneler yerine) ait bir yığın izleme satırları vurgulamak.

Çözüm gdb-python kullanmaktı (MSYS'de; Linux'ta genellikle gdbPython yerleşik olarak geliyor mu?), Kanca backtrace, kullanım

python stack_trace = gdb.execute('backtrace', False, True')

Sonra stack_tracePython'un normal ifadeleri ile işleyin ve yazdırın. Kalın ve diğer renkler aşağıdaki gibi bir işlevle elde edilir:

def term_style(*v):
    """1 is bold, 30--37 are the 8 colours, but specifying bold may also
    change the colour. 40--47 are background colours."""
    return '\x1B['+';'.join(map(str, v))+'m'

#Use like this:
print term_style(1) + 'This will be bold' + term_style(0) #Reset.
print term_style(1,30) + 'This will be bold and coloured' + term_style(0)
print term_style(1,30,40) + 'Plus coloured background' + term_style(0)

Kancayı kullanan çalışan bir örnek - minimal olsa bile - muhtemelen daha hoş karşılanacaktır.
Hi-Angel

4

Renklerin başka bir iyi kombinasyonu bu yapılandırma ile verilir . Geri çekilmeleri kontrol etmeyi çok daha kolay hale getirir. Kullanmak için dosyayı şu şekilde kaydedin ~/.gdbinitve gdb'yi normal şekilde çalıştırın


Teşekkürler, tam olarak aradığım şey buydu. Uzun çağrı yığını olan çok iş parçacıklı bir uygulamaya bakıyordum ve bu geri çekmeler için mükemmel.
Johan Bjäreholt

-2

istediğiniz renkleri elde edebilirsiniz;

# gdb
(gdb) shell echo -en '\E[47;34m'"\033[1m"
...
anything is now blue foreground and white background
...
(gdb) shell tput sgr0
... back to normal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.