如何根据core文件中错误地址定位程序

如何根据core文件中错误地址定位程序,第1张

The problem that no `core' file is created on a segmentation faultLocate errors in the source with GDB and `core' files

Linux 程序在遇到段错误(常见的是由非法访问内存引起)的时候会产生 core 文件,如果这个程序包含调试信息(编译的时候加 -g 选项),那么使用 gdb 读取这个 core 文件可以快速定位出错的源代码。原来在某软件公司实习的时候(用 RedHat Enterprise Linux)觉得这样非常方便查错,但我自己用的 Debian GNU/Linux 却默认不生成这个文件。

检查以后发现原因是 core 文件最大尺寸(用 ulimit -c 查看)是 0,把它设置成非 0 值就可以了,如:

ulimit -c 2048(设置 core 文件最大尺寸为 2048 blocks,1block=512bytes,因此这里设置的其实是 1MiB)

ulimit -c unlimited(不限 core 文件尺寸)

附:用 gdb 根据 core dump 文件定位错误的办法。

用这个程序作一个测试:

int foo (int *p)

{

return *p

}

main()

{

foo (0)

}

derek@dli: /tmp $ gcc -g a.c

derek@dli: /tmp $ ./a.out

段错误 (core dumped)

derek@dli: /tmp $ gdb ./a.out -c core

(这里略去约十行其他信息)

Core was generated by `./a.out'.

Program terminated with signal 11, Segmentation fault.

#0 0x0804834a in foo (p=0x0) at a.c:3

3 return *p

如果再输入一条命令 bt,就可以看得清清楚楚错误是在什么时机产生的:

(gdb) bt

#0 0x0804834a in foo (p=0x0) at a.c:3

#1 0x0804836b in main () at a.c:8

不能有比这更清楚的错误信息了!如果是在 Windows 下,就老老实实 Trace and Step 吧。

wgcoredll无法找到定位程序的第一,由于下载过程中,系统的软件的源代码发生丢失,导致系统无法被识别,出现错误。

第二,由于软件在安装完毕后,子文件或者执行程序的文件收到损坏,导致系统无法运行这个软件,从而导致出现错误,

第三,由于系统与软件当前版本不兼容导致。

希望能帮到您原因:

1、 打开Dump格式文件

打开WinDbg,通过菜单[File] à [Open Crash dump] 选择dump文件打开,也可通过CMD打开Dos命令窗口,切换到WinDbg所在目录,利用命令:

WinDbg –z “D:/Lines2009-7-25-22-20-33-900.dmp”

-z表示路径

图1.1 利用WinDbg打开dump文件

本文编写了一个简单能产生除数为0异常的程序,让其运行,产生崩溃,通过drwtsn产生dmp文件,然后通过windbg分析dmp文件,定位程序bug。

目的:学习windbg基本功能使用。

程序源代码:

void Crash(void)

{

int i = 1

int j = 0

i /= j

}

void main(void)

{

Crash()

}

编译环境:vc++6.0

编译器设置:

这一步设置,要求对release版本不使用优化,如果使用优化,上面源代码中Crash(void)函数将不被汇编。

这一步设置,产生release版本的调试符号表,为后续定位错误准备。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8097817.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存