dmesg和addr2line 定位 segfault】的更多相关文章

程序长时间运行崩溃,但是没有保存core dump消息.可以用下面的方法定位出程序出错位置: 1. 用dmesg查找出错的代码段地址 ip 000000000041ccec 发生错误时指令的地址, sp sp 00007fff53c48700 堆栈指针 error 4的意义如下,可以对照参考: bit2:值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界bit0: 值为1表示没有足够的权限访问非…
前言 在现网环境下,程序奔溃后不一定会留下core文件,原因有很多,比如存储空间不足就是其中一个常见的原因.此时我们只能依据linux记录的错误日志来定位问题. 涉及linux命令 本文涉及以下几条命令 1. dmesg命令,用于获取程序出错时的堆栈地址 1)dmesg |grep -E 'segfault|general'可以通过该命令过滤出发生崩溃的程序,以及对应的堆栈信息.之前看网上的其他文章仅过滤segfault,但我在实践中发现"general protection"的提示信…
在Linux下写C/C++程序的程序员,时常与Core Dump相见.在内存越界访问,收到不能处理的信号,除零等错误出现时,我们精心或不精心写就的程序就直接一命呜呼了,Core Dump是Linux仁慈地留下的程序的尸体,帮助程序员们解决了一个又一个问题. 有时配置不给力,Linux直接毁尸灭迹,没有了Core文件:又有时,刚好磁盘空间不足,Core文件写不下了.没有Core文件的时候,如何知道程序在什么地方出错了呢?addr2line就在这时派上用场. 这是一个示例程序,func函数返回参数a…
1.如果没有产生core文件,可以查询系统log 通过 sudo cat /var/log/messages |grep segfault 或者 sudo dmesg|grep segfault 获得这种信息一般都是由内存访问越界造成的,不管是用户态程序还是内核态程序访问越界都会出core, 并在系统日志里面输出一条这样的信息.这条信息的前面分别是访问越界的程序名,进程ID号,访问越界的地址以及当时进程堆栈地址等信息,比较有用的信息是 最后的error number. 在上面的信息中,error…
GNU为GCC编译器提供了配套的辅助工具集(Binutils)http://www.gnu.org/software/binutils/ 1. addr2line ①将指定地址转换为对应的文件名和行号 ②常用于分析和定位内存访问错误的问题 ③示例:定位0地址访问问题 *开启core dump选项:ulimit -c unlimited(关闭:ulimit -c 0 查看是否开启:ulimit -c) *运行程序,并生成崩溃时的core文件 *读取core文件,获取IP寄存器的值:dmesg co…
封装 jni 的 java 层 Integer.Long 对象使用时必须用 new 对象的形式,防止修改 128>x x>-128 之间缓存的对象,一定要谨记 配置 在 eclipse 环境下开发 jni 1. 导入 ndk Window->Preferences->Android->NDK,点击 Browse 引入 ndk 的目录 2. 创 建 java 类 , 声 明 一 个 private native String CBBT_getVersionString(); J…
我的收藏 他山之石,可以攻玉 转载请注明出处:https://ahangchen.gitbooks.io/windy-afternoon/content/ 开发过程中收藏在Chrome书签栏里的技术文章,与自己的文章分开. 主要涉及python,android,ubuntu等内容,我自己常常在这里面找回忘了的知识. Chrome书签导出markdown的方法可以在这里查看 python What's New In Python 3.0 - Python v3.1.5 documentation…
Linux反汇编调试方法 Linux内核模块或者应用程序经常因为各种各样的原因而崩溃,一般情况下都会打印函数调用栈信息,那么,这种情况下,我们怎么去定位问题呢?本文档介绍了一种反汇编的方法辅助定位此类问题. 代码示例如下: #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <execinfo.h> #include <fcntl.h> #include <…
addr2line有什么作用呢? 可别小瞧它, 它能够定位到代码出错的位置. 以下, 我们来看看这个简单的代码: #include <stdio.h> int main() { int *p = NULL; *p = 0; printf("bad\n"); return 0; } 这个程序非常小, 我们能够一眼就看出程序在执行期出错. 可是, 假设是大程序, 在执行期出错. 我们该怎样定位呢?  那就必须依赖于工具. 而不是你我的肉眼. 我们以上述小程序为例, 进行例如以下…
[root@localhost log]# cat -n /root/xx.c #include <stdio.h> void func(char *p) { *p = 'p'; } int main(int argc, char *argv[]) { char *p=NULL; func(p); ; } [root@localhost log]# /root/xx   [root@localhost log]# dmesg xx[8226]: segfault at 0 ip 0000000…