- A+
所属分类:未分类
实例一:
通过系统日志查询定位错误位置
首先,我们建立一个addr2line.c,内容如下:
[root@xubo ~]# more addr2line.c #include<stdio.h> int main(void) { char *str="hello baiked.com"; str[0]='h'; return 0; }
通过gcc编译测试代码,注意需要增加-g选项,不然没有调试信息。
命令如下:
gcc addr2line.c -g -o addr2linetest
执行完成后,会产生addr2linetest文件,如下:
[root@xubo ~]# ls addr2line.c addr2linetest
然后,我们运行addr2linetest ,如下:
[root@xubo ~]# ./addr2linetest 段错误
然后我们通过查看使用dmesg日志进行跟踪,如下:
[root@xubo ~]# dmesg|tail
[ 10.562389] sr 1:0:0:0: Attached scsi generic sg1 type 5
[ 13.357285] ip_tables: (C) 2000-2006 Netfilter Core Team
[ 13.419695] nf_conntrack version 0.5.0 (16384 buckets, 65536 max)
[ 13.496213] ip6_tables: (C) 2000-2006 Netfilter Core Team
[ 13.747794] Ebtables v2.0 registered
[ 13.793730] Bridge firewalling registered
[ 15.723660] IPv6: ADDRCONF(NETDEV_UP): eno16777736: link is not ready
[ 15.724611] e1000: eno16777736 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
[ 15.725467] IPv6: ADDRCONF(NETDEV_CHANGE): eno16777736: link becomes ready
[ 807.709510] addr2linetest[2631]: segfault at 4005a0 ip 0000000000400500 sp 00007fff80f196c0 error 7 in addr2linetest[400000+1000]
注意看红色标记的部分,addr2linetest执行文件的描述:segfault(段错误)ip为400500这就是程序执行出错的位置。这时,我们就可以用addr2line命令来定位问题程序的位置了,命令如下:
addr2line -e addr2linetest 400500
结果如下:
[root@xubo ~]# addr2line -e addr2linetest 400500 /root/addr2line.c:6
然后我们看看源文件,如下:
1 #include<stdio.h>
2
3 int main(void)
4 {
5 char *str="hello baiked.com";
6 str[0]='h';
7 return 0;
8 }
这样的话,addr2line就可以准确的定位出程序出错的位置。
实例二:
自定义地址找到函数位置
首先,我们建立一个addr2line.c,内容如下:
[root@xubo ~]# vi addr2line.c #include<stdio.h> void baiked () { printf("baiked() address is %p!\n",baiked); } int main(void) { baiked(); return 0; }
这里我们将baiked函数的地址自己打印出来了,编译后,云运行如下:
[root@xubo ~]# gcc addr2line.c -g -o addr2linetest [root@xubo ~]# ./addr2linetest baiked() address is 0x400530!
然后用addr2line通过打印出来的400530定位baiked函数的位置,命令如下:
addr2line -e addr2linetest 400530 -f
结果如下:
baiked /root/addr2line.c:4
- 安卓客户端下载
- 微信扫一扫
- 微信公众号
- 微信公众号扫一扫