私は、デーモンプロセスにgdbを付けて、デブモンをデバッグしています。現在の機能がどこにあるのか、つまりデーモンバイナリやロードされた共有オブジェクトに関数が存在するかどうか調べるのは非常に便利です。共有オブジェクトの場合は、その名前またはパスを持つと便利です。関数がある場所を調べる
これはできますか?
私は、デーモンプロセスにgdbを付けて、デブモンをデバッグしています。現在の機能がどこにあるのか、つまりデーモンバイナリやロードされた共有オブジェクトに関数が存在するかどうか調べるのは非常に便利です。共有オブジェクトの場合は、その名前またはパスを持つと便利です。関数がある場所を調べる
これはできますか?
(gdb) info symbol 0x002a4995
_IO_new_file_write + 7 in section .text of /lib/i386-linux-gnu/libc.so.6
それは機能は、私は現在で だところ何とか把握に非常に有用であろう、あなたが現在ロードされている共有ライブラリのアドレスに機能アドレスを比較することによって、それを行うことができます
に位置しています。
(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
アドレス0x00250be0
と/lib/i386-linux-gnu/libc.so.6
がロードされた0x0035ebd4
間にあるれ、0x002a4995
あります。つまり、_IO_new_file_write
はlibc.so.6
ライブラリに属します。
'info symbol 'は、これを行うための簡単な方法です(特に100以上の共有ライブラリが読み込まれている場合)。 –
あなたは正しいです、これはずっと簡単です、+1 – ks1322