1 / 6
文档名称:

Linux下的段错误(Segmentationfault)产生的原因及调试方法.pdf

格式:pdf   大小:223KB   页数:6页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Linux下的段错误(Segmentationfault)产生的原因及调试方法.pdf

上传人:小s 2022/6/19 文件大小:223 KB

下载得到文件列表

Linux下的段错误(Segmentationfault)产生的原因及调试方法.pdf

文档介绍

文档介绍:Linux 下的段错误(Segmentation fault)产生的原因及调试方法(经典)
2009-04-05 11:25
简而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不
存在对应的物m /lib/...done.
Loaded symbols for /lib/
Reading symbols from /lib/ld-...done.
Loaded symbols for /lib/ld-
Core was generated by `./'.
Program terminated with signal 11, Segmentation fault.
#0 0x08048524 in dummy_function () at :4
4 *ptr = 0x00;
哇,好历害,还是一步就定位到了错误所在地,佩服一下 Linux/Unix 系统的此类设计。
接着考虑下去,以前用 windows 系统下的 ie 的时侯,有时打开某些网页,会出现“运行时错
误”,这个时侯如果恰好你的机器上又装有 windows 的编译器的话,他会弹出来一个对话框,
问你是否进行调试,如果你选择是,编译器将被打开,并进入调试状态,开始调试。
Linux 下如何做到这些呢?我的大脑飞速地旋转着,有了,让它在 SIGSEGV 的 handler 中调
用 gdb,于是第三个方法又诞生了:
:
#include <>
#include <>
#include <>
#include <>

void dump(int signo)
{
char buf[1024];
char cmd[1024];
FILE *fh;

snprintf(buf, sizeof(buf), "/proc/%d/cmdline", getpid());
if(!(fh = fopen(buf, "r")))
exit(0);
if(!fgets(buf, sizeof(buf), fh))
exit(0);
fclose(fh);if(buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = '\0';
snprintf(cmd, sizeof(cmd), "gdb %s %d", buf, getpid());