Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 获取Unix上正在运行的应用程序的指令指针_Debugging_Unix_Gdb - Fatal编程技术网

Debugging 获取Unix上正在运行的应用程序的指令指针

Debugging 获取Unix上正在运行的应用程序的指令指针,debugging,unix,gdb,Debugging,Unix,Gdb,有没有办法获取正在运行的Unix应用程序的指令指针 我有一个正在运行的进程(C++),希望获得它的当前位置,然后在GDB中(在另一台机器上)将该位置映射到源位置(“list”命令)。如果您仍在使用GDB,您只需将自己连接到一个正在运行的进程,如下所示: gdb program 1234 其中,program是正在调试的可执行文件的名称,1234是PID。然后,您可以使用gdb的所有功能调试进程。您需要临时停止进程或线程,以获取其当前指令指针。您可以通过使用或(在HP-UX上)连接到进程并访问寄

有没有办法获取正在运行的Unix应用程序的指令指针


我有一个正在运行的进程(C++),希望获得它的当前位置,然后在GDB中(在另一台机器上)将该位置映射到源位置(“list”命令)。

如果您仍在使用GDB,您只需将自己连接到一个正在运行的进程,如下所示:

gdb program 1234

其中,
program
是正在调试的可执行文件的名称,
1234
是PID。然后,您可以使用gdb的所有功能调试进程。

您需要临时停止进程或线程,以获取其当前指令指针。您可以通过使用或(在HP-UX上)连接到进程并访问寄存器来完成此操作。

在Linux上,有
/proc/[pid]/stat
。 从
“人工程序”

AFAICT,输出的第29个字段对应于进程的当前指令指针。例如:

gdb date
GNU gdb Red Hat Linux (6.0post-0.20040223.20rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu"...(no debugging symbols found)...Using host libthread_db library "/lib64/tls/libthread_db.so.1".

(gdb) set stop-on-solib-events 1
(gdb) run
(no debugging symbols found)...(no debugging symbols found)...(no debugging symbols found)...[Thread debugging using libthread_db enabled]
[New Thread 182896391360 (LWP 27968)]
(no debugging symbols found)...Stopped due to shared library event
(gdb) c
[Switching to Thread 182896391360 (LWP 27968)]
Stopped due to shared library event
(gdb) where
#0  0x00000036b060bb20 in _dl_debug_state_internal () from /lib64/ld-linux-x86-64.so.2
#1  0x00000036b060b51c in _dl_init_internal () from /lib64/ld-linux-x86-64.so.2
#2  0x00000036b0600f72 in _dl_start_user () from /lib64/ld-linux-x86-64.so.2
#3  0x0000000000000001 in ?? ()
#4  0x0000007fbff62728 in ?? ()
#5  0x0000000000000000 in ?? ()
(gdb) shell cat /proc/27968/stat
27968 (date) T 27839 27968 8955 34817 27839 4194304 42 0 330 0 0 0 0 0 18 0 0 0 1881668573 6144000 78 18446744073709551615 4194304 4234416 548680739552 18446744073709551615 234887363360 0 0 0 0 18446744071563322838 0 0 17 0 0 0 0 0 0 0
(gdb) p/a 234887363360  <--- the value of 29th field
$1 = 0x36b060bb20 <_dl_debug_state_internal>
gdb日期
GNU gdb Red Hat Linux(6.0post-0.20040223.20rh)
版权所有2004免费软件基金会。
GDB是自由软件,受GNU通用公共许可证的保护,您是
欢迎在特定条件下更改和/或分发副本。
键入“显示复制”以查看条件。
GDB绝对没有保修。有关详细信息,请键入“显示保修”。
此GDB已配置为“x86_64-redhat-linux-gnu”…(未找到调试符号)…使用主机libthread_db library“/lib64/tls/libthread_db.so.1”。
(gdb)在solib事件1上设置停止
(gdb)运行
(未找到调试符号)…(未找到调试符号)…(未找到调试符号)…[启用使用libthread_db的线程调试]
[新螺纹182896391360(LWP 27968)]
(未找到调试符号)…由于共享库事件而停止
(gdb)c
[切换到线程182896391360(LWP 27968)]
由于共享库事件而停止
(gdb)在哪里
#来自/lib64/ld-linux-x86-64.so的0 0x00000036b060bb20处于调试状态
#1 0x00000036b060b51c,位于/lib64/ld-linux-x86-64.so中的_dl_init_internal()中。2
#2 0x00000036b0600f72,位于/lib64/ld-linux-x86-64.so中的_dl_start_user()中
#3 0x0000000000000001英寸??()
#4 0x0000007fbff62728英寸??()
#5 0x0000000000000000英寸??()
(gdb)壳牌cat/proc/27968/stat
27968(日期)T 27839 27968 8955 34817 27839 4194304 42 0 330 0 0 0 0 18 0 0 0 1881668573 6144000 78 18446744073709551615 4194304 4234416 548680739552 18446744073709551615 2348877363360 0 1844674407156332288 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

(gdb)p/a 234887363360可以使用以下代码在Linux上检索指令指针:

pid_t traced_process;
struct user_regs_struct regs;

ptrace(PTRACE_ATTACH, traced_process, NULL, NULL);
ptrace(PTRACE_GETREGS, traced_process, NULL, &regs);

printf("EIP: %lx\n", regs.eip);

我在运行应用程序的机器上没有gdb。之后会在另一台机器上使用它来做映射。啊。。。在这种情况下:对不起,我不知道。这是特定于操作系统的。您正在使用哪个操作系统?这个特定的操作系统是针对HPUX的。但对于Linux来说,这也很有趣。当任务未被阻止但处于运行状态(您确实使用来自gdb的断点/ptrace阻止了它)时,“kstkeip%lu当前EIP”字段是否正确?仅当
ptrace_可以访问(任务、ptrace_模式| ptrace_模式| NOAUDIT)时,才允许打印此字段-;但我不确定该字段是何时填充的(是根据请求还是最后一个任务阻塞?)。
pid_t traced_process;
struct user_regs_struct regs;

ptrace(PTRACE_ATTACH, traced_process, NULL, NULL);
ptrace(PTRACE_GETREGS, traced_process, NULL, &regs);

printf("EIP: %lx\n", regs.eip);