3 puan yazan GN⁺ 2024-11-16 | 1 yorum | WhatsApp'ta paylaş
  • 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
    • mi yorumlayıcısını destekleyen GDB
      • Kontrol komutu: gdb --interpreter=mi
    • 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:
  • Flatpak beta sürümü:
    • Seer release page
    • seer.flatpak indirilip kurulur
    • GDB Launcher içinde GDB’yi çalıştırmak için flatpak-spawn --host gerekir

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, finish gibi 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
    • ^F ile 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 * ekler
      • SHIFT + çift tıklama değişkenin önüne & ekler
      • CTRL+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, Stepi kısayollarını destekler; varsayılan olarak genelde Ctrl+F5, CTRL+F6 kullanılır
    • Assembly sekmesinde ^F kullanı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 points dizisi 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 *this iç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.net adresine gönderilebilir ya da GitHub issue olarak açılabilir
  • Issue kaydı: GitHub issues

1 yorum

 
GN⁺ 2024-11-16
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/

    • Seergdb’nin yazarıyım. Düzenleyici yazı tipi ayarının çalışmadığı kısmı biraz daha açıklarsan iyi olur; testlerde çalışıyor gibi görünüyor
      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
    • Kendi kodumdaki hatayı ararken bir de hata ayıklama aracının hatalarıyla uğraşmak istemediğim için, bir dahaki sefere hata ayıklamam gerektiğinde Gede’yi denemek üzere not aldım
  • 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...

    • Kişisel olarak TUI yerine komut satırını tercih ediyorum ama .gdbinit içine şöyle koyabilirsiniz
      tui new-layout default regs 1 {-horizontal src 1 asm 1} 2 status 0 cmd 1
      tui layout default
      tui enable
    • Neovim + nvim-dap + nvim-dap-ui + gdb kombinasyonu bundan çok daha iyiydi
    • Ne yazık ki yalnızca GDB TUI desteği dahil derlenmişse çalışıyor
  • Birç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 + L bilmek yeterli
    $XDG_CONFIG_HOME/gdb/gdbinit içine yalnızca şunları koyuyorum
    layout src
    set confirm off

    • Renkli prompt’u şöyle kullanmayı seviyorum
      set prompt \001\033[01;36m\002(gdb)\001\033[0m\002
      Geçmişi şöyle kaydediyorum
      set history save on
      set history size 500000
      set history filename ~/.cache/gdb/history
    • gdb-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 oluyor
      Dashboard’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ü
    • gef tmux destekliyor; böylece program çıktısı başka bir tmux paneline gidiyor
    • Emacs içindeki gud-gdb front-end’i oldukça rahat ve kullanımı kolay
  • 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

    • Uzak tarafta gdbserver çalışıyorsa yeterli değil mi?
  • 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

    • Qt Creator’da GDB’nin karmaşık ayar gerektirmeden çalışması hoşuma gidiyor. Birkaç breakpoint koyup çalıştır’a basınca IDE gerisini hallediyor
    • GDB GUI listesine bir tane daha eklemek gerekirse benim yaptığım da var: https://github.com/dzaima/grr
      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
    • DDD de var. Motif front-end’i
    • VS Code’da da fena olmayan bir GDB front-end’i var ve özellikle gömülü mikrodenetleyici hata ayıklarken iyi
    • Web tabanlı debugger’lardan söz açılmışken, yakın zamanda x86-64 assembly hata ayıklamaya odaklanan benzer bir proje yaptım: https://github.com/robalb/x86-64-playground
  • 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

    • LSP ortaya çıktıktan sonra Emacs bana diğer her şeyden daha iyi gelmeye başladı. Ayrılmak için bir sebep yok. Özellikle native compilation ile hızlandıktan sonra bu daha da doğru
      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
    • GUD üzerinden temel entegrasyon olan M-x gud-gdb yerine Emacs'in GDB Graphical Interface'i olan M-x gdbyi tercih ediyorum
      Yakı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...
    • dape(https://github.com/svaante/dape#), Debug Adapter Protocol'ü uygulayan bir debugger'a sahip diller için iyi bir seçenek
      debugpy ile birlikte kullanınca artık M-x pdb kullanmaz oldum; arayüzü de M-x gdbye çok benziyor
    • lsp-mode + dap-mode da iyi çalışıyor, ama launch.json dosyasını bir ölçüde elle kurcalamak gerekiyor
  • Gü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/

    • 20 yıl önce üniversitede DDD öğrenmiştim; o zaman bile hantal gelmişti. Şimdi çok daha hoşgörülü bakıyorum ama Motif hâlâ gözüme batıyor
      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
    • Elbette DDD'nin bakımı sürüyor. Özellikleri hakkında burada yazdım: https://begriffs.com/posts/2022-07-17-debugging-gdb-ddd.html
      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
    • DDD'de çeşitli grafik görselleştirmelerin yerleşik olmasını seviyorum. Özellikle veri yapılarını görselleştirme özelliğini hep harika bulmuşumdur
      Eskiden GTK3'e port etmeye çalışan bir proje vardı ama kaybolmuş gibi görünüyor. Yine de ana projenin devam etmesine sevindim
    • Bana cygwin döneminde Windows'ta iyi çalışan, en sevdiğim GDB ön yüzü Insight'ı hatırlatıyor. Ne yazık ki kesinlikle artık bakımı yapılmıyor: https://sourceware.org/insight/screenshots.php
      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
    • DDD harika. Hâlâ kullanıyorum ama ben fosil gibi biriyim
      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

    • Saf meraktan soruyorum, GNU ne yüzünden alaya alınıyor?
  • 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