linux下调试方法记录
2012-12-25 16:26
405 查看
1、segment fault
segment fault是几乎多有C程序员都会碰到的问题,多为内存问题,因为glibc库中基本所有的函数都默认形参指针是非空的,这样以下原因就可能导致段错误:
(1)引用一个包含非法值的指针(当然包括空指针)。
(2)未得到正确的权限的时候进行访问,例如往只读的内存地址写数据。
(3)内存越界(数组越界,变量类型不一致等)
调试segment fault的几种常见方法:
(1) 打印log,这种方法的前提是你知道在哪行代码附近会出问题;
(2) gdb调试,对于小代码,可以逐行调试,大工程就比较头疼咯;
(3) core dump调试,当一个程序崩溃时,在进程当前工作目录的core文件中复制了该进程的存储图像。core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的。
首先,设置core大小
#设置core大小为无限
ulimit -c unlimited
#设置文件大小为无限
ulimit unlimited
使用core文件调试程序
看下面的例子:
编译:
gcc–g core_dump_test.c -o core_dump_test
如果需要调试程序的话,使用gcc编译时加上-g选项,这样调试core文件的时候比较容易找到错误的地方。
执行:
./core_dump_test
段错误
调式core文件
core文件是个二进制文件,需要用相应的工具来分析程序崩溃时的内存映像,在Linux下可以用GDB来调试core文件。
gdb core_dump_test core
Loaded symbols for /lib/ld-linux.so.2
#0 0x080482fd in core_test () at core_dump_test.c:7
7 str[1] = 'T';
(gdb) where
#0 0x080482fd in core_test () at core_dump_test.c:7
#1 0x08048317 in main () at core_dump_test.c:12
#2 0x42015574 in __libc_start_main () from /lib/tls/libc.so.6
GDB中键入where,就会看到程序崩溃时堆栈信息(当前函数之前的所有已调用函数的列表(包括当前函数),gdb只显示最近几个),我们很容易找到我们的程序在最后崩溃的时候调用了core_dump_test.c第7行的代码,导致程序崩溃。注意:在编译程序的时候要加入选项-g。您也可以试试其他命令, 如 fram、list等。更详细的用法,请查阅GDB文档。
segment fault是几乎多有C程序员都会碰到的问题,多为内存问题,因为glibc库中基本所有的函数都默认形参指针是非空的,这样以下原因就可能导致段错误:
(1)引用一个包含非法值的指针(当然包括空指针)。
(2)未得到正确的权限的时候进行访问,例如往只读的内存地址写数据。
(3)内存越界(数组越界,变量类型不一致等)
调试segment fault的几种常见方法:
(1) 打印log,这种方法的前提是你知道在哪行代码附近会出问题;
(2) gdb调试,对于小代码,可以逐行调试,大工程就比较头疼咯;
(3) core dump调试,当一个程序崩溃时,在进程当前工作目录的core文件中复制了该进程的存储图像。core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的。
首先,设置core大小
#设置core大小为无限
ulimit -c unlimited
#设置文件大小为无限
ulimit unlimited
使用core文件调试程序
看下面的例子:
/*core_dump_test.c*/ #include <stdio.h> const char *str = "test"; void core_test(){ str[1] = 'T'; } int main(){ core_test(); return 0; }
编译:
gcc–g core_dump_test.c -o core_dump_test
如果需要调试程序的话,使用gcc编译时加上-g选项,这样调试core文件的时候比较容易找到错误的地方。
执行:
./core_dump_test
段错误
调式core文件
core文件是个二进制文件,需要用相应的工具来分析程序崩溃时的内存映像,在Linux下可以用GDB来调试core文件。
gdb core_dump_test core
Loaded symbols for /lib/ld-linux.so.2
#0 0x080482fd in core_test () at core_dump_test.c:7
7 str[1] = 'T';
(gdb) where
#0 0x080482fd in core_test () at core_dump_test.c:7
#1 0x08048317 in main () at core_dump_test.c:12
#2 0x42015574 in __libc_start_main () from /lib/tls/libc.so.6
GDB中键入where,就会看到程序崩溃时堆栈信息(当前函数之前的所有已调用函数的列表(包括当前函数),gdb只显示最近几个),我们很容易找到我们的程序在最后崩溃的时候调用了core_dump_test.c第7行的代码,导致程序崩溃。注意:在编译程序的时候要加入选项-g。您也可以试试其他命令, 如 fram、list等。更详细的用法,请查阅GDB文档。
相关文章推荐
- Linux下关于内存的调试方法记录
- linux下段错误调试方法
- Linux下core文件调试方法
- Linux下core文件调试方法收藏
- Linux JIRA+MYSQL安装与调试方法
- Linux 程序调试方法
- Linux下V4L2一个调试问题方法(拍照偏绿)
- Linux Cpu占用高调试方法
- linux服务器内存崩溃调试方法
- Linux环境下段错误的产生原因及调试方法小结
- linux sqlplus查询数据中文乱码解决方法记录
- linux下core文件调试方法
- Linux环境下段错误的产生原因及调试方法小结
- viewController调试不走deinit方法(个人记录)
- Linux下使用.sig签名文件验证 使用方法(仅记录,仍未解决。 请大侠指教)
- linux 下RTL8723/RTL8188调试记录(命令行)【转】
- Linux下多线程程序调试方法
- linux下core 文件的调试方法
- Linux环境下段错误的产生原因及调试方法小结
- Linux清除用户登录记录和命令历史方法