首页 > 代码库 > Segment Fault 的访问地址究竟在哪里?
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 ...
Segment Fault 的访问地址究竟在哪里?
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。