Seer: Linux için GDB’ye yönelik bir GUI ön ucu
(github.com/epasveer)- Seer, Linux’ta GDB’yi bir GUI üzerinden kullanmak için bir ön uçtur ve basit ama hoş görünen bir GDB GUI’si hedefiyle aktif olarak geliştirilmektedir
- Kurulum paket yöneticisiyle veya kaynak koddan derleme yoluyla yapılabilir; gereksinimler Linux, C++17, MI yorumlayıcısını destekleyen GDB, CMake 3.5.0 ve üzeri, Qt6’dır
- Qt5 artık en güncel kaynak ağacında derlenmemektedir; 2.3 kaynak ağacı Qt5 ile derlenebilen son ağaçtır ve v1.17 son Qt5 sürümüdür
- Seer; kaynak gezintisi, değişken·register gösterimi, breakpoint·watchpoint·catchpoint·printpoint yönetimi, stack·thread görünümü ve GDB reverse debugging desteğini GUI içinde sunar
- Ek özellikler olarak assembly görünümü, bellek·dizi·yapı·görsel görselleştirme ve çalışan program için giriş/çıkış konsolu sunarak GDB hata ayıklama işlerini görsel olarak ele almayı sağlar
Proje özeti
- Seer, Linux için bir GDB GUI ön ucudur
- Amaç, GDB için basit ama hoş görünen bir GUI sunmaktır
- Proje aktif olarak geliştirilmektedir; hatalar veya istenen özellikler e-posta ya da GitHub issue üzerinden iletilebilir
Kurulum ve gereksinimler
- Seer, paket yöneticisi veya kaynak koddan derleme ile kurulabilir
- Gereksinimler:
- Linux
- C++17
miyorumlayıcısını destekleyen GDB- Kontrol komutu:
gdb --interpreter=mi
- Kontrol komutu:
- CMake 3.5.0 veya üzeri
- Qt6
- Kaynaktan derlerken dağıtıma uygun Qt6 geliştirme paketleri gerekir
- Gerekli Qt6 modülleri Core, Gui, Widgets, PrintSupport, Charts, Svg’dir
- Qt6 derleme rehberi: Building Seer - Qt6
- Qt5 ile ilgili sınırlamalar:
-
Seer artık Qt5 ile derlenmiyor
- 2.3 kaynak ağacı, Qt5 ile derlenebilen son ağaçtır
- Qt5 derleme rehberi: Building Seer - Qt5
-
Paket kurulum yolları
- Manjaro’nun Pamac’ı:
pamac install seer
- openSUSE Tumbleweed’in zypper’ı:
zypper install seergdb
- Flathub:
- io.github.epasveer.seer
flatpak install flathub io.github.epasveer.seer
- Flatpak beta sürümü:
- Seer release page
seer.flatpakindirilip kurulurGDB Launcheriçinde GDB’yi çalıştırmak içinflatpak-spawn --hostgerekir
Sürümler ve Qt geçişi
- Yeni gelişmeler Seer Wiki üzerinden takip edilebilir
- v1.17, son Qt5 sürümüdür
- Bir sonraki sürüm v2.0 olacak ve Qt6 tabanlıdır
- Bir süre daha Qt5 ile derlemek mümkün olsa da, en güncel kararlı Qt5 kaynağı gerekiyorsa v1.17 kullanılmalıdır
Çalıştırma biçimi
- Seer, komut satırından hata ayıklanacak programı kolayca başlatmak için tasarlanmıştır
- GDB program hata ayıklamayı birden fazla şekilde desteklediğinden, Seer de birden fazla başlatma yöntemi sunar
- Başlatma yöntemleri Starting Seer wiki sayfasında görülebilir
Ana GUI yapısı
-
Source/Function/Types/Variables/Libraries
- Programda kullanılan kaynak·header dosyalarının listesini gösterir
- Fonksiyonlar, tipler ve statik değişkenler aranabilir
- Çift tıklayarak kaynak dosyası açılabilir
- Programın referans verdiği paylaşımlı kütüphanelerin listesini gösterir
- Kaynak·header dosya listesi, arama ile gösterilen öğeleri daraltabilir
-
Variable/Register Info
- Değişken ve register değerlerini gösterir
- Logger, değişken değerlerini kaydeder
- Tracker, GDB
step,next,finishgibi durma noktalarına her ulaştığında belirlenen değişkenlerin değerlerini gösterir - Registers, tüm CPU register değerlerini gösterir
-
Code Manager
- Seer GUI’sinin ortasındaki büyük alandır ve kaynak dosyaları sekmeler halinde gösterir
^File dosya içinde metin araması yapılabilir- Bir değişken adı çift tıklanarak Logger’a eklenebilir
CTRL+ çift tıklama değişkenin önüne*eklerSHIFT+ çift tıklama değişkenin önüne&eklerCTRL+SHIFT+ çift tıklama değişkenin önüne*&ekler
- Sağ tık menüsüyle değişken Tracker’a veya Memory Visualizer’a eklenebilir
- Belirli bir satırda breakpoint ya da printpoint oluşturulabilir
- Belirli bir satıra kadar çalıştırılabilir
- Sekmeler çift tıklamayla ayrılabilir
Hata ayıklama denetimi ve çalışma durumu görünümü
- Alt bölüm breakpoint, watchpoint, catchpoint, printpoint, manuel GDB komutları ve loglar ile ilgilenir
- Manuel komut sekmesinde GDB veya GDB/MI komutları doğrudan girilebilir
- Girilen komutlar bir sonraki Seer kullanımında da hatırlanır
- Breakpoint manager, breakpoint oluşturur ve yönetir
- Watchpoint manager, değişken erişimini izler
- Okuma, yazma veya okuma·yazma izlenebilir
- Catchpoint manager, C++ içindeki throw, rethrow ve catch çağrılarında çalışmayı durdurur
- Printpoint manager, GDB’nin
dprintfözelliği gibi belirli noktalarda değişken yazdırabilir - GDB output, GDB programının kendi çıktısını kaydeder
- Seer output, Seer programının tanılama amaçlı çıktısını kaydeder
- Stack frame bilgisi:
- Frame listesine çift tıklayarak geçerli fonksiyon scope’u değiştirilebilir
- Her frame’in fonksiyon argümanları gösterilir
- Geçerli fonksiyonun yerel değişken değerleri gösterilir
- Thread bilgisi:
- Tüm thread ID listesini gösterir
- Bir thread ID’sine çift tıklayarak geçerli thread scope’u değiştirilebilir
- Her thread’in stack frame’leri listelenir
- GDB’nin Reverse Debugging modunu destekler
- Komut kaydı açılıp kapatılabilir
- Oynatma yönü forward veya reverse olarak ayarlanabilir
Konsol ve assembly görünümü
- Seer Console, çalıştırılabilir dosyanın tüm metin çıktısını gösterir
- Çalıştırılabilir dosya için metin girdisi de konsoldan verilebilir
- Assembly View, kaynak kod sekmelerinin yanına o anda çalıştırılan assembly’yi gösteren bir sekme ekler
View->Assembly Viewüzerinden etkinleştirilir- Assembly sekmesinde de breakpoint ayarlanabilir
- Geçerli komut vurgulanır
- Breakpoints sekmesi veya Stack frames sekmesindeki bir öğeye çift tıklanınca ilgili adresin assembly’si gösterilir
Nexti,Stepikısayollarını destekler; varsayılan olarak geneldeCtrl+F5,CTRL+F6kullanılır- Assembly sekmesinde
^Fkullanıldığında arama çubuğu gösterilir - Bu assembly özelliği yeni bir özelliktir ve değişiklik ile özellik önerilerine açıktır
Görselleştirme araçları
-
Memory Visualizer
- Ham bellek içeriği incelenebilir
- Bellek ve disassembly biçiminde görüntülenebilir
-
Array Visualizer
- Dizi içeriğini görselleştirir
- Normal, Spline, Scatter gösterim biçimlerini sunar
- İki dizi bir X-Y grafiği olarak kullanılabilir
- Örnek
pointsdizisi bir X-Y kontur şekli oluşturur
-
Struct Visualizer
- C/C++ struct veya C++ class içeriğini gösterir
- Örnekte mevcut C++ class’ın
*thisiçeriği gösterilir - Temel tipteki struct üyeleri düzenlenebilir
- Daha hafif bir Basic Struct Visualizer da vardır; ancak pointer takip edemez ve düzenleme yapamaz
-
Image Visualizer
- Görsel olan ham bellek içeriğini görüntülemek için kullanılabilir
Destek ve iletişim
- Hata veya özellik istekleri
epasveer@att.netadresine gönderilebilir ya da GitHub issue olarak açılabilir - Issue kaydı: GitHub issues
1 yorum
Hacker News yorumları
Linux’ta Godot ile birlikte derleyip biraz kullandım; genel olarak fena değil ama UI fazla widget doldurulmuş gibi hissettiriyor ve biraz cilasız görünüyor
Düzenleyici yazı tipini değiştirmek çalışmadı; değerini görmek için bir değişkenin üzerine fareyle gelince ya hiçbir şey olmuyor ya da imleç çok kısa süre değişip sonra GDB, tip/anahtar sözcük içeren bir ifadeyi kullanmaya çalıştığına dair hata veriyor
Değişkene çift tıklamak mevcut değeri ve zaman damgasını bir panele ekliyor; yani UI’da değer/ifade okuma işlevi var, ama tooltip tarafındaki uygulama bozuk gibi
Biraz cilalanırsa kullanışlı olabilir; ancak şimdiye kadar denediğim front-end’ler içinde en az rahatsız olduğum Gede oldu. UI’ı sade ve sezgisel; çok fazla özelliği olmasa da sunduğu özellikler genelde hatasız çalışıyor: https://gede.dexar.se/
Ayarları kalıcı kaydetmek için “Save Configuration...” yapmak gerekiyor. Değişken değeri için fareyle üzerine gelince gösterme özelliğini de test edeceğim; hata ya da özellik isteklerini GitHub issue olarak bırakırsan iyi olur
GDB’nin şaşırtıcı derecede kullanımı kolay yerleşik bir metin kullanıcı arayüzü (TUI) de var. Fare etkileşimini bile destekliyor: https://sourceware.org/gdb/current/onlinedocs/gdb.html/TUI.h...
.gdbinitiçine şöyle koyabilirsiniztui new-layout default regs 1 {-horizontal src 1 asm 1} 2 status 0 cmd 1tui layout defaulttui enableBirçok GDB front-end’i denedikten sonra TUI’ın en iyisi olduğunu düşünüyorum. Program çıktı basıp arayüzü bozduğunda yeniden çizdirmek için
Ctrl + Lbilmek yeterli$XDG_CONFIG_HOME/gdb/gdbinitiçine yalnızca şunları koyuyorumlayout srcset confirm offset prompt \001\033[01;36m\002(gdb)\001\033[0m\002Geçmişi şöyle kaydediyorum
set history save onset history size 500000set history filename ~/.cache/gdb/historygdb-dashboardu çok kullandım ve öneririm. TUI’a benzer ama gösterilecek bilgileri daha çeşitli biçimde seçip ekleyebiliyorsunuz ve renkler sayesinde çıktı çok daha okunabilir oluyorDashboard’u başka bir terminalde ya da birden fazla terminale bölerek de gösterebildiğiniz için daha iyi pencere yerleşimleri oluşturulabiliyor. Eskiden tmux ile terminal yerleşimini otomatik üretip GDB’ye bağlayacak bir betik yazmıştım; epey uğraştırıyor ama oldukça iyi bir düzen elde edilebiliyor
Ctrl + L, TUI türevlerinde mutlaka bilinmesi gereken bir şey; Vim ekranı bozulduğunda da buna dahil. Bunu öğrendikten sonra sayısız gizemli “çökme” çözüldüWindows’tan Linux’a bağlanmışsanız ya da WSL kullanıyorsanız, Linux süreçlerini WinDBG/VisualStudio ile uzaktan da hata ayıklayabilirsiniz
Bu, GDB için bir Qt UI
Bildiğim kadarıyla GDB için web tabanlı bir UI olan gdbgui de var: https://www.gdbgui.com/
Hata ayıklama araçları tarafında daha fazla hareket görmek her zaman iyi
Bazı kullanım alanları için hâlâ gerekli olabilecek epey özellik eksik. Çünkü benim kullanım tarzım çoğunlukla assembly seviyesinde hata ayıklama olduğundan çok gösterişli özelliklere ihtiyaç duymadım
2 yıl önce de orta ölçekli bir tartışma olmuştu: https://news.ycombinator.com/item?id=33044885
Emacs kullanıcısıysanız GUD oldukça iyi bir GDB entegrasyonudur
Bu ayın yeni editörü birkaç oyuncak gibi özellik ekledi diye sürekli denemenin anlamı yok. Emacs'e bir eklenti ekleyince aynı özelliği elde edip geri kalanını sevdiğim şekilde koruyabiliyorum
Atom'un olduğu dönemde kodlamaya ciddi şekilde kapıldım; Atom'un ortadan kalkıp VS Code'a dönüşmesine epey üzüldüm. Çünkü VS Code iyi olsa da Atom'la aynı felsefeyi izlemiyor
Yaklaşık 4 yıl önce Emacs'i öğrendiğimden beri hiçbir yeni araç beni “bu eski teknoloji, geçiş yapmalısın” diye ikna edemedi. Biraz alakasız uzun bir nutuk oldu ama Emacs'in yaşamaya devam etmesine gerçekten minnettarım
M-x gud-gdbyerine Emacs'in GDB Graphical Interface'i olanM-x gdbyi tercih ediyorumYakın zamanda lldb çalıştırmak için GUD'a geçmem gerekti; kesme noktalarını, thread'leri, mevcut stack'i vb. gösteren özel pencereleri özledim
GUD'un iyi yanı, debugger değişse de arayüzün tutarlı olması. Bu yüzden pdb ile Python debug ederken lldb ile C++ debug etmeye geçtiğinizde klavye kısayollarını yeniden öğrenmeniz gerekmiyor
https://www.gnu.org/software/emacs/manual/html_node/emacs/GD...
https://www.gnu.org/software/emacs/manual/html_node/emacs/St...
debugpy ile birlikte kullanınca artık
M-x pdbkullanmaz oldum; arayüzü deM-x gdbye çok benziyorlsp-mode+dap-modeda iyi çalışıyor, amalaunch.jsondosyasını bir ölçüde elle kurcalamak gerekiyorGüzel. İlk gördüğümde bana sihir gibi gelen DDD'yi hatırlatıyor. DDD'nin hâlâ bakımının yapılıyor olması şaşırtıcı
https://en.wikipedia.org/wiki/Data_Display_Debugger
https://www.gnu.org/software/ddd/
Yıllar içindeki sohbetlere bakınca DDD paradoksal biçimde harika bir ters pazarlama aracı olmuş; geliştiricileri sevdikleri IDE'nin yerleşik debugger arayüzüne itmiş gibi. DDD'nin kendisi gerçekten çok güçlü, ama “kullanışlılık estetikten önemlidir” anlayışının da bir sınırı var
Yazıyı yazdıktan sonra bakımcılar işaret ettiğim sorunları düzeltti; artık birçok geçici çözüme gerek yok. 3.4.0 ve 3.4.1 oldukça büyük sürümler
Eskiden GTK3'e port etmeye çalışan bir proje vardı ama kaybolmuş gibi görünüyor. Yine de ana projenin devam etmesine sevindim
Yine de biri GitHub'a taşıyıp canlandırmış ve üzerinde biraz çalışmış gibi görünüyor: https://github.com/antony-jr/insight
Eski Sun Microsystems makinelerinde kullandığım dbxtool'a benzer bir şey ararken DDD'yi bulmuştum. Günümüz insanları kaynak seviyesinde debug etme gibi şeyler sayesinde epey lüks içinde
GNU projesi ve RMS meme gibi sıkça alaya alınıyor gibi görünüyor, ama GDB güçlü bir araç. Kendim çok az kurcaladım, fakat yıllar boyunca geliştiricilerin çalışmalarına muazzam etkisi olmuş gibi duruyor
10 yılı aşkın süre önce Linux'ta C++ yazarken yerleşik debugger'ı olan Qt Creator kullanıyordum. Bir GDB ön yüzüydü, çok iyi çalışıyordu; C++ ve Qt için başka bir şey kullanmak için sebep görmüyordum