我在无意之中发现一位大佬的博客,写得还不错。
于是之中,我看见了他的这个
果不其然,我决定要自己亲手操作一番。
毕竟自己在linux (ubuntu) 使用多年,编程语言还是有比较多的,精通的都没有,例如说c/c++. java,python 还有js (其实js算不上,哈哈),好嘞 ,说正事!
在我 决定写一个测试 程序时,也就是比较简单的
#include <stdio.h>
int main(){
int *p = NULL;
*p = 0;
printf("bad\n")
return 0;
}
当时,我是 加了编译选项的,也就是所谓的 -g 嘛
这个在上学的那会,老师还是教过的。
可是,我按照上文给的链接的时候,啥也没出来?
??:0
这是什么情况?
凡事都得亲自操作,这是真的? 我想应该跟我的操作系统有关吧!我决定上网找找看!
在这个链接中在程序内部的-pie二进制文件中获取addr2line的地址
给出了,这样一个提示,说是在编译的时候,加个选项!
--tip:
现在在ubuntu 18.04上使用时,addr2line给出了很多??:0
。 我对backtrace_symbols(3)
linux函数给出的人类可读格式不感兴趣,我想要可以在必要时使用单独分发的调试符号(剥离到单独的.dbg文件)进行解码的简洁格式。
我可以使用-no-pie
编译,但我不想这样做。 看来这是我们在生产中不想要的东西。
我了解到,如果对于每个指针(上面的array[i]
)我都从/proc/<pid>/maps
删除值并将其转换回十六进制,那么我会得到addr2line可以理解的地址。
--end
按照上面博客解决方法其实还有,就是用偏移量的方式,这个我还去找怎么解决呢?
附上:
最后,感谢大佬的辛勤劳作,有你们的坚持与努力,我们才会更棒!一起加油吧!!奥利给