Linux altında, şu anda çalışan bir işlemde hata ayıklamak için GDB kullanabilir miyim?
Linux altında, şu anda çalışan bir işlemde hata ayıklamak için GDB kullanabilir miyim?
Yanıtlar:
Evet. attach
Komutu kullanın . Daha fazla bilgi için bu bağlantıya göz atın . help attach
Bir 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.attach
Mevcut 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).file
Programı 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_scope
bağlı olarak ayarlamanız gerekecektir . Artık birçok sistem varsayılan 1
veya 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.
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
.
İle çalışan bir işleme ekleyebilirsiniz gdb -p PID
.
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`
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.
-p
önünde program_id
? Ayrıca, çalışan bir işleme eklemek için gdb'yi sudo ile çalıştırmak gerekebilir.
Kullanılacak komut, gdb attach pid
pid'in, eklemek istediğiniz işlemin işlem kimliği olduğu yerdir.
Evet yapabilirsin. Bir işlemin foo
çalıştığını varsayın ...
ps -elf | grep foo PID numarasını arayın gdb -a {PID numarası}
Bir işlem eklemek isterseniz, bu işlemin aynı sahibi olması gerekir. Kök, herhangi bir işleme bağlanabilir.
ps -elf PID'yi göstermiyor gibi görünüyor. Bunun yerine şunu kullanmanızı öneririm:
ps -ld | grep foo
gdb -p PID
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>