Segment Fault 的访问地址究竟在哪里?

如果指针写数据失败, 比如

 *p = 1

可以进一步看, 究竟为何失败

可以用察看  /proc/{pid}/maps, 但往往这个时候,程序已经crash 了,就找不到这个文件。

那就只能在crash 之前code 插入代码看了。

写一个copyfile 的函数


static void copyfile(char * rfile, char * wfile) {
int rfd, wfd,size;
rfd=open(rfile,O_RDONLY);
wfd=open(wfile,O_WRONLY|O_CREAT,644);

char buffer[2048];
while ( (size=read(rfd,buffer,sizeof(buffer))) > 0)
        write(wfd,buffer,size);

close(rfd);
close(wfd);

}

关键是如何使用了, 比如怀疑 addr  指针由问题,直接用给地址指向位置赋值的方法去验证,并在其前面用 上面copyfile函数, dump /proc/serlf/maps 文件。


    char wf[80];

    sprintf(wf, "/tmp/%d", getpid());
    copyfile("/proc/self/maps", wf);

    LOG("=========1 gralloc_lock() *(int *)( vaddr %p) = 1 ", addr);
    *(int *)(addr) = 1;
    LOG("=========2 gralloc_lock() *(int *)(vaddr %p) = 1 ", addr);
    return 0;


例子: 

笔者遇到一个 Seg Fault, 通过dump /proc/self/maps 文件, 发现指针直接指向只读的 so load内存,就更清楚为何会 crash了。

09-22 03:07:17.813    17   367 E gralloc : =========1 gralloc_lock() *(int *)(* vaddr 0xd724e000) = 1
09/22/14 07:07:17.813:*ERR*016F: Segmentation fault.

---- maps ---
...
[15:11:24] Payne.Pan: d67d5000-d7314000 r-xp 00000000 08:02 3671888                            /nzzs/lib/libNNApe.so
...





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值