Çalışan bir işlemde hata ayıklamak için GDB kullanabilir miyim?


110

Linux altında, şu anda çalışan bir işlemde hata ayıklamak için GDB kullanabilir miyim?

Yanıtlar:


88

Evet. attachKomutu kullanın . Daha fazla bilgi için bu bağlantıya göz atın . help attachBir GDB konsoluna yazmak aşağıdakileri verir:

(gdb) help attach

GDB dışındaki bir işleme veya dosyaya ekleyin. Bu komut, son " target" komutunuzla aynı türden başka bir hedefe eklenir (" info files" hedef yığınınızı gösterecektir). Komut bağımsız değişken olarak bir işlem kimliğini, bir işlem adını (son ek olarak isteğe bağlı bir işlem kimliği ile) veya bir cihaz dosyasını alabilir. Bir işlem kimliği için, sürece bir sinyal gönderme iznine sahip olmanız ve hata ayıklayıcı ile aynı etkin kullanıcı kimliğine sahip olması gerekir. attachMevcut bir işlemde " " kullanılırken , hata ayıklayıcı işlemde çalışan programı bulur, ilk önce geçerli çalışma dizinine bakar veya (orada bulunamazsa) kaynak dosya arama yolunu kullanarak (" directory" komutuna bakın). fileProgramı belirtmek ve sembol tablosunu yüklemek için " " komutunu da kullanabilirsiniz .


NOT: Linux çekirdeğindeki gelişmiş güvenlik nedeniyle bir işleme bağlanmakta zorluk çekebilirsiniz - örneğin, bir kabuğun alt öğesini diğerinden eklemek.

Muhtemelen gereksinimlerinize /proc/sys/kernel/yama/ptrace_scopebağlı olarak ayarlamanız gerekecektir . Artık birçok sistem varsayılan 1veya daha yüksek.

The sysctl settings (writable only with CAP_SYS_PTRACE) are:

0 - classic ptrace permissions: a process can PTRACE_ATTACH to any other
    process running under the same uid, as long as it is dumpable (i.e.
    did not transition uids, start privileged, or have called
    prctl(PR_SET_DUMPABLE...) already). Similarly, PTRACE_TRACEME is
    unchanged.

1 - restricted ptrace: a process must have a predefined relationship
    with the inferior it wants to call PTRACE_ATTACH on. By default,
    this relationship is that of only its descendants when the above
    classic criteria is also met. To change the relationship, an
    inferior can call prctl(PR_SET_PTRACER, debugger, ...) to declare
    an allowed debugger PID to call PTRACE_ATTACH on the inferior.
    Using PTRACE_TRACEME is unchanged.

2 - admin-only attach: only processes with CAP_SYS_PTRACE may use ptrace
    with PTRACE_ATTACH, or through children calling PTRACE_TRACEME.

3 - no attach: no processes may use ptrace with PTRACE_ATTACH nor via
    PTRACE_TRACEME. Once set, this sysctl value cannot be changed.

8
Bağlantısı kesik :( benim açımdan bakıldığında, olarak cevaplar gibi bu bir mesafede J. Polfer Cheers).
olibre

Bağlantıyı düzelttim.
Attie

bu aynı zamanda uzak bir hedefteki bir sürecin pid'i için de işe yarar mı?
Bionix1441

Uzak hedefte bir hata ayıklama sunucusu çalıştırmanız gerekir; ondan sonra aynı olmalı.
Carl Norum

Bayrak kullanılarak değiştirilebilir echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope.
Daisuke Aramaki


24

Evet. Yapabilirsin:

gdb program_name program_pid

Bir kısayol (yalnızca bir örneğin çalıştığını varsayarak):

gdb program_name `pidof program_name`

Bunun ne işe yaradığını bilmiyorum ama benim için işe yaramadığına eminim. <program_pid> varolmadığını söylüyor.
Owl

2
Sürece eklemenin yanı sıra sembol tablosunu yüklediği için bunun en iyi sonucu verdiğini görüyorum. program_nameİkili ile aynı dizindeyseniz çalıştığına dikkat edilmelidir . Farklı bir dizindeyseniz, ikiliye giden bir yolun işe yarayacağını düşünüyorum.
KarateSnowMachine

Unutur vermedi -pönünde program_id? Ayrıca, çalışan bir işleme eklemek için gdb'yi sudo ile çalıştırmak gerekebilir.
mxmlnkn

15

Kullanılacak komut, gdb attach pidpid'in, eklemek istediğiniz işlemin işlem kimliği olduğu yerdir.


3

Evet yapabilirsin. Bir işlemin fooçalıştığını varsayın ...

ps -elf | grep foo

PID numarasını arayın

gdb -a {PID numarası}

5
Hangi dağıtımla çalışıyorsunuz? Fedora'nın yeni bir sürümünü kullanarak, 'gdb -a' bir "seçenek -a belirsiz" hatası yazdırır.
Justin Ethier

1
resmi argüman -p / - pid
Mahmoud Al-Qudsi

3

Bir işlem eklemek isterseniz, bu işlemin aynı sahibi olması gerekir. Kök, herhangi bir işleme bağlanabilir.


2

ps -elf PID'yi göstermiyor gibi görünüyor. Bunun yerine şunu kullanmanızı öneririm:

ps -ld | grep foo
gdb -p PID

2

En kolay yol, işlem kimliğini sağlamaktır .

gdb -p `pidof your_running_program_name`

Lütfen komuttaki seçeneklerin tam listesini alın man gdb.

Çalışan aynı program için birden fazla işlem olması durumunda, aşağıdaki komut işlemleri listeleyecektir.

ps -C program -o pid h
<number>

Daha sonra çıktı işlem kimliği (sayı) gdb'ye bağımsız değişken olarak kullanılabilir.

gdb -p <process id>
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.