注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

windfly's sky

the sky I can fly like the wind

 
 
 

日志

 
 

共享库权限导致的程序崩溃调试总结  

2017-02-15 16:56:00|  分类: linux learn |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

调试一个程序,现象是进程序直接退出。
1.printf
首先想到的是在main函数里面找,用printf来看是执行到哪里。结果在main函数的一开始就增加打印信息都没有出来。
后来想到该程序使用了大量的动态链接库,而动态链接库里又有全局变量存在。因此推断问题出在动态链接库里面。尤其是在进main函数之前执行的代码。
于是在动态链接库文件里的类构造函数加打印信息。结果有一些打印出来了。但是库太多,也没法一个一个挨个加。放弃。
2.gdb
编译时增加了-g参数,生成调试信息,然后用gdb调试,希望能查到原因。
可是,gdb下运行,出现退出的信息,用where查看,给出的是main函数的最后,而且报的错误是一个assert,就是说程序直接就没进main函数,直接就到了main之后的释放内存,而报错的部分也是在析构函数里出现的。
用gdb单步调试也不能调动态库里的,不过在动态库里下断点倒是能断下来,这又回到了第一个问题,库太多,不知道在哪下断点。
用到的命令
#gdb XX
gdb>set args xxx  //设置程序启动参数
gdb>b 类名::函数名 //在动态库里下断点
gdb>s  //step into
gdb>n //step over
gdb>where
gdb>list

3.重新回到原来的问题,怎么去下断点,怎么找到在进main函数之前执行的代码。怎么找到库中的类全局变量。
尝试了nm xxx
objdump -x xxx
出了好多的信息,但是没懂。。。

到这里又到了死胡同。
最后的解决近乎讽刺,我又找了一台机器来执行程序,居然没有退出,而且执行成功了。
再查,原来新的机器里我把程序和库的权限改成了4777。
而我调试用的机器是虚拟机,而且是用与主机共享文件夹。而虽然是root用户执行,但是组不对,而库文件o的权限没有,也就悲剧了。
把库文件改成4777.
再次运行,成功了。
  评论这张
 
阅读(30)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018