我们已经很熟悉用gdb来调试core了, 对于一个完整的core(需要有对应的so), 调试core很简单, 但最近遇到这样一个问题:

       用gdb调试过, 能查到core在哪个函数里面, 但是, 无法知道core在哪一行, 用i locals, i args查询显示No symbol table info available, 也就是没法显示对应的栈变量, 这是什么原因呢? 原因有二(我亲自玩过并验证过奋斗):

      1.  编译的时候, 没有调试符号信息, 如-g参数

      2.  编译出so库之后, 被strip命令脱了衣服(关于strip命令, 我们已经在之前的博文中讲过了, 故不再赘述)


      所以, gdb调试core时能用i locals看栈变量、函数行(即不出现No symbol table info available)的必要条件

      1. 编译时有-g参数; 

      2. so库没有被strip脱衣服


      最近遇到gdb调试core时能看到栈变量、函数行(也就是不出现No symbol table info available)的问题, 恰好是因为so库被strip命令脱衣服了。  

(gdb) i locals
No symbol table info available.
(gdb) 

      于是, 我重新编译一个未被stip的库(修改makefile), 然后就可以定位到函数行了, 可以用i locals看变量值了, 再也没有出现No symbol table info available了。

       爽爽哒!


       最后啰嗦一句, 判断so库是否被strip脱过衣服, 可以用file命令哈。










本文转载:CSDN博客