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

【搬运】因为原来的博客要关,所以从原来的博客搬运过来。

调试一个程序,现象是进程序直接退出。
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.
再次运行,成功了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值