在linux下,我可以使用GDB调试当前正在运行的进程吗?我可以使用GDB调试正在运行的进程吗?
回答
是的。使用attach
命令。查看this link了解更多信息。在GDB控制台输入help attach
给出如下:
(gdb) help attach
附加到一个进程或GDB之外的文件。 此命令附加到另一个目标,它与您上次的 “
target
”命令相同(“info files
”将显示您的目标堆栈)。 该命令可能会将进程ID,进程名称 (带有可选的进程ID作为后缀)或设备文件作为参数。 对于进程ID,您必须具有发送进程信号的权限, 并且它必须与调试器具有相同的有效uid。 在现有进程中使用“attach
”时,调试器会查找正在运行的程序,首先查看当前工作的 目录,或者(如果未找到)使用源文件搜索路径 (请参阅“directory
“命令)。您也可以使用“file
”命令 来指定程序并加载其符号表。
注意:您可能会遇到困难连接到一个过程中,由于improved security in the Linux kernel - 例如连接到从另一个外壳的孩子。
根据您的要求,您可能需要设置/proc/sys/kernel/yama/ptrace_scope
。现在许多系统默认为1
或更高。
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.
要使用的命令是gdb attach pid
其中pid是要附加到进程的进程ID。
您可以使用gdb -p PID
附加到正在运行的进程。
是的,你可以。假定进程foo
正在运行...
ps -elf | grep foo look for the PID number gdb -a {PID number}
你在运行什么样的发行版?使用最新版本的Fedora,'gdb -a'会打印出一个“选项-a不明确”的错误。 – 2010-02-22 14:16:35
官方的说法是-p/- pid – 2017-08-18 15:43:08
是的。你可以这样做:
gdb program_name program_pid
快捷方式将(假设只有一个实例在运行):
gdb program_name `pidof program_name`
我不知道那是干什么的,但它确实是地狱不适合我。它说
我发现这个效果最好,因为它除了附加到进程外还加载符号表。应该注意的是,如果你和二进制文件在同一个目录中,'program_name'就可以工作。我认为如果你在一个不同的目录中,这个二进制文件的路径可以工作。 – KarateSnowMachine 2016-05-18 17:49:58
PS -elf似乎并没有显示PID。 我建议使用来代替:
ps -ld | grep foo
gdb -p PID
如果一个人要附加一个过程,这个过程必须有相同的所有者。根可以附加到任何进程。
- 1. 使用gdb调试正在运行的守护进程
- 2. 我可以产生附加到正在运行的调试器的进程吗?
- 3. GDB可以调试lambda吗?
- 4. gdb可以调试suid root程序吗?
- 5. 使用GDB进行调试
- 6. 使用GDB调试进程
- 7. 使用GDB进行远程调试
- 8. gdb可以用什么样的程序进行调试?
- 9. 如何在windows中运行cuda-gdb?我可以使用cygwin吗?
- 10. 使用Windows命令行可以计算我正在运行的进程吗?
- 11. 使用Linux Eclipse,我可以编程式告诉我正在执行调试器(gdb)吗?
- 12. 我可以在xcode上使用中文iphone进行调试吗?
- 13. 如何在调试正在运行的进程的gdb中启用泄漏?
- 14. 使用gdb/dbx调试线程进程
- 15. 运行VS单元测试时可以进行调试吗?
- 16. 在多个进程中使用GDB进行调试
- 17. 我可以使用showPythonShell进行Django调试吗?
- 18. 我可以使用Cling进行调试吗?任何API?
- 19. 我可以调用正在运行的Windows服务功能吗?
- 20. 我可以在gdb中用c字符串调用主机进程函数吗?
- 21. Golang使用GDB进行调试?
- 22. 使用gdb和objdump进行调试
- 23. 使用ndk-gdb进行Android NDK调试
- 24. 如何使用gdb进行调试?
- 25. 使用valgrind和gdb进行调试
- 26. 无法使用GDB进行调试
- 27. CUDA:使用-deviceemu和gdb进行调试
- 28. 我可以用cuda-gdb调试openACC吗?还是其他的调试工具?
- 29. GDB可以更改正在运行的程序的汇编代码吗?
- 30. 用gdb在postgres中进行调试
该链接已损坏:(从我的角度来看,我喜欢[J. Polfer](http:// stackoverflow)中的[This one](http://stackoverflow.com/a/2702170/938111) .com/users/40411/j-polfer)。干杯;) – olibre 2013-03-25 10:56:19
我已修复链接。 – Attie 2017-10-13 10:06:41
这是否也适用于远程目标上的进程的PID? – Bionix1441 2018-03-08 09:20:46