- 主题:bbs外挂的那些so如何在gdb里面调试?
就是那种通过读取配置文件的加载的动态链接库
比如说smth里面的bbsnet.so,libpip.so等等,程序进入gdb以后so的信息
一点都看不到。
--
FROM 202.118.224.*
我试了一下可以,下面是我进入穿梭的一个bt例子
(gdb) bt
#0 0x420d889d in select () from /lib/tls/libc.so.6
#1 0x4085b1f0 in __JCR_LIST__ () from service/libbbsnet.so
#2 0x080b98d1 in igetkey () at newio.c:633
#3 0x080b2bc6 in list_select_loop (conf=0xbfffdb20) at select.c:485
#4 0x40859077 in main_loop () at bbsnet.c:613
#5 0x408590c5 in bbsnet_main () at bbsnet.c:622
#6 0x0807e182 in exec_mbem (s=0xbfffdde1 "@mod:service/libbbsnet.so")
at comm_lists.c:423
#7 0x0807ec90 in domenu (menu_name=0x81006a8 "TOPMENU") at comm_lists.c:656
#8 0x080b7d6d in main_bbs (convit=0, argv=0xbffffc3b "bbsd:atppp")
at newmain_single.c:1253
#9 0x080b1334 in bbs_main (argv=0xbffffc3b "bbsd:atppp") at bbsd_single.c:631
#10 0x080b14c2 in bbs_standalone_main (argv=0xbffffc3b "bbsd:atppp")
at bbsd_single.c:717
#11 0x080b15fe in main (argc=3, argv=0xbfffe644) at bbsd_single.c:808
#12 0x42015704 in __libc_start_main () from /lib/tls/libc.so.6
关键是那些库一般会停在调用bbs函数的地方,所以src/目录你也要-g编译
另外gdb load的时候可能会找不到service/libbbsnet.so比方说,可能要命令行给路径
我直接在~bbs/下执行,gdb自己能找到。
【 在 deem (沙丘男爵) 的大作中提到: 】
: 就是那种通过读取配置文件的加载的动态链接库
: 比如说smth里面的bbsnet.so,libpip.so等等,程序进入gdb以后so的信息
: 一点都看不到。
: ...................
--
修改:atppp FROM 128.12.181.*
FROM 128.12.181.*
这样调试:
1. bbsd 和 .so 都要 -g 编译
2. attach 一个运行中的 bbsd
3. 设置断点在 exec_mbem 函数
4. 在 if (hdll) 处也设置断点
5. 用 c 命令执行到 if(hdll) 处
6. 用几个 n 单步执行到 func() 处
7. 用 s 进入 func(),这时就已经进入 .so 的主函数了
后面就很简单了,想怎么调试就怎么调试。
【 在 deem (沙丘男爵) 的大作中提到: 】
: 就是那种通过读取配置文件的加载的动态链接库
: 比如说smth里面的bbsnet.so,libpip.so等等,程序进入gdb以后so的信息
: 一点都看不到。
: ...................
--
FROM 166.111.160.*
谢谢你的提醒,不过有一点我刚才才测试出来,应该确认代码跑到so里面以后
att,要不然gdb还是不知道去load 那个 so的信息。
总结一些,一共2点需要注意:
1. 确认程序已经运行进so的代码
2. 在~bbs/下面启动gdb bbsd 并 att那个pid
这样就能正常调试那个通过配置文件加载的so了。
【 在 atppp (Big Mouse) 的大作中提到: 】
: 我试了一下可以,下面是我进入穿梭的一个bt例子
: (gdb) bt
: #0 0x420d889d in select () from /lib/tls/libc.so.6
: ...................
--
FROM 202.118.224.*