检查功能所在的位置

时间:2012-03-31 06:23:02

标签: gdb

我正在通过将gdb附加到守护程序进程来调试gdb中的守护程序,并设置gdb在它分叉时跟随子进程。以某种方式确定我当前所处的函数所在的位置是非常有用的 - 即,该函数是否存在于守护进程二进制文件中或加载的共享对象中。如果它是一个共享对象,那么拥有它的名称或路径会很有用。

可以这样做吗?

2 个答案:

答案 0 :(得分:5)

(gdb) info symbol 0x002a4995
_IO_new_file_write + 7 in section .text of /lib/i386-linux-gnu/libc.so.6

答案 1 :(得分:1)

  

以某种方式弄清楚我的功能是非常有用的   目前,位于

您可以通过将函数地址与当前加载的共享库的地址进行比较来实现。

(gdb) bt
#0  0x00130416 in __kernel_vsyscall ()
#1  0x002fc683 in __write_nocancel () at ../sysdeps/unix/syscall-template.S:82
#2  0x002a4995 in _IO_new_file_write (f=0x3b4500, data=0xb7ffd000, n=4) at fileops.c:1276
#3  0x002a4874 in new_do_write (fp=0x3b4500, data=0xb7ffd000 "123\n", to_do=4) at fileops.c:530
#4  0x002a5eee in _IO_new_do_write (fp=0x3b4500, data=0xb7ffd000 "123\n", to_do=4) at fileops.c:503
#5  0x002a6235 in _IO_new_file_overflow (f=0x3b4500, ch=10) at fileops.c:889
#6  0x002a6e4b in __GI___overflow (f=0x3b4500, ch=10) at genops.c:248
#7  0x0029da6f in _IO_putc (c=10, fp=0x3b4500) at putc.c:33
#8  0x001b835b in __gnu_cxx::stdio_sync_filebuf<char, std::char_traits<char> >::overflow(int) () from /usr/lib/i386-linux-gnu/libstdc++.so.6
#9  0x001b966e in std::ostream::put(char) () from /usr/lib/i386-linux-gnu/libstdc++.so.6
#10 0x001b98e4 in std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&) () from /usr/lib/i386-linux-gnu/libstdc++.so.6
#11 0x001b8cae in std::ostream::operator<<(std::ostream& (*)(std::ostream&)) () from /usr/lib/i386-linux-gnu/libstdc++.so.6
#12 0x08048ac5 in main () at so-test.cpp:10
(gdb) info sharedlibrary 
From        To          Syms Read   Shared Object Library
0x00110830  0x001275af  Yes (*)     /lib/ld-linux.so.2
0x00176e50  0x001e93a8  Yes (*)     /usr/lib/i386-linux-gnu/libstdc++.so.6
0x0021df50  0x00234cf8  Yes (*)     /lib/i386-linux-gnu/libgcc_s.so.1
0x00250be0  0x0035ebd4  Yes         /lib/i386-linux-gnu/libc.so.6
0x003bb4b0  0x003d6ab8  Yes         /lib/i386-linux-gnu/libm.so.6
(*): Shared library is missing debugging information.
(gdb) 

例如_IO_new_file_write地址为0x002a4995,位于0x00250be00x0035ebd4之间,其中/lib/i386-linux-gnu/libc.so.6已加载。那是_IO_new_file_write属于libc.so.6库。