gdb远程调试--动态加载符号文件


宿主机
使用gdbserver  --attach 0.0.0.0:port(端口任意指定)  pid

客户端 

1、执行gdb (使用交叉编译环境的gdb arm-linux-gdb) 
2、在gdb命令行中  target remote  ip:port
这时候可能要调试的模块没有符号表,需要动态加载符号表,适合调试没有符号信息的设备环境
3、add-symbol-file
add-symbol-file FILE ADDR [-s -s ...]
Load the symbols from FILE, assuming FILE has been dynamically loaded.
ADDR is the starting address of the file's text.
The optional arguments are section-name section-address pairs and
should be specified if the data and bss segments are not contiguous
with the text.  SECT is a section name to be loaded at SECT_ADDR.

FILE:编译好的带调试信息的debug文件
ADDR:代码段的起始地址
如何计算代码段的起始地址:
1、使用objdump -h libxx.so  或者 readelf -S libxx.so  .text 表示代码段
Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .hash             HASH            000000b4 0000b4 0011b4 04   A  2   0  4
  [ 2] .dynsym           DYNSYM          00001268 001268 002620 10   A  3  17  4
  [ 3] .dynstr           STRTAB          00003888 003888 001ed2 00   A  0   0  1
  [ 4] .gnu.version      VERSYM          0000575a 00575a 0004c4 02   A  2   0  2
  [ 5] .gnu.version_r    VERNEED         00005c20 005c20 000090 00   A  3   2  4
  [ 6] .rel.dyn          REL             00005cb0 005cb0 000160 08   A  2   0  4
  [ 7] .rel.plt          REL             00005e10 005e10 0009c0 08   A  2   9  4
  [ 8] .init             PROGBITS        000067d0 0067d0 000017 00  AX  0   0  4
  [ 9] .plt              PROGBITS        000067e8 0067e8 001390 04  AX  0   0  4
  [10] .text             PROGBITS        00007b78 007b78 01f32c 00  AX  0   0  4
  [11] .fini             PROGBITS        00026ea4 026ea4 00001b 00  AX  0   0  4
  [12] .rodata           PROGBITS        00026ec0 026ec0 003b48 00   A  0   0 32
  [13] .eh_frame_hdr     PROGBITS        0002aa08 02aa08 00002c 00   A  0   0  4
  [14] .eh_frame         PROGBITS        0002aa34 02aa34 00010c 00   A  0   0  4
  [15] .data             PROGBITS        0002b000 02b000 0052a8 00  WA  0   0 32
  [16] .dynamic          DYNAMIC         000302a8 0302a8 000100 08  WA  3   0  4
  [17] .ctors            PROGBITS        000303a8 0303a8 000008 00  WA  0   0  4
  [18] .dtors            PROGBITS        000303b0 0303b0 000008 00  WA  0   0  4
  [19] .jcr              PROGBITS        000303b8 0303b8 000004 00  WA  0   0  4
  [20] .got              PROGBITS        000303bc 0303bc 000554 04  WA  0   0  4
  [21] .bss              NOBITS          00030920 030920 000228 00  WA  0   0 32
  [22] .comment          PROGBITS        00000000 030920 00092a 00      0   0  1
  [23] .shstrtab         STRTAB          00000000 03124a 0000b6 00      0   0  1

Addr表示该块起始地址相对于文件起始地址的偏移

2、查看模块在进程空间中的起始地址
[sangfor]# cat /proc/9300/maps | grep libxx
2ae93000-2aebe000 r-xp 00000000 03:02 259        /usr/lib/libxx.so   <---带x的是代码段
2aebe000-2aec4000 rw-p 0002b000 03:02 259        /usr/lib/libxx.so

2ae93000是文件libxx.so的起始地址
所以代码段的真实地址是2ae93000 + 00007b78 = ADDR

add-symbol-file path/libxx.so ADDR
这样代码段的符号信息就被加载进去了,现在可以正常设置断点

3、如果需要访问代码段之外数据可以通过 -s指定其他块的地址,比如指定data段地址
add-symbol-file path/libxx.so ADDR  -s (2ae93000+0002b000)

 

你可能感兴趣的:(linux)