Linux:如何调试SIGSEGV?如何跟踪错误源?

前端之家收集整理的这篇文章主要介绍了Linux:如何调试SIGSEGV?如何跟踪错误源?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的firefox从今天开始崩溃.我没有在系统或firefox配置上更改任何内容.

我用
strace -ff -o dumpfile.txt firefox
追踪问题.这不是一个很大的帮助.

我在两个生成的进程转储中看到了segfault,
但我如何能够追溯他们的原因呢?

运行10秒后崩溃,
strace生成22MB的数据.

这是输出的片段,您可以在中间看到实际的SIGSEGV:

read(19,"\372",1)                     = 1
gettimeofday({1245590019,542231},NULL) = 0
read(3,"\6\0[Qmy\26\0\3\1\0\0Y\0\200\2\0\0\0\0\323\3A\0\323\3(\0\20\0\1\0",4096) = 32
read(3,0xf5c55058,4096)               = -1 EAGAIN (Resource temporarily unavailable)
gettimeofday({1245590019,542813},NULL) = 0
poll([{fd=4,events=POLLIN},{fd=3,{fd=8,events=POLLIN|POLLPRI},{fd=12,{fd=13,{fd=14,events=POL
read(3,543161},NULL) = 0
gettimeofday({1245590019,546672},546761},546936},events=POL
poll([{fd=3,events=POLLIN|POLLOUT}],1,4294967295) = 1 ([{fd=3,revents=POLLOUT}])
writev(3,[{"5\30\4\0006\21\200\2\266\n\200\2\17\0]\3\230\4\5\0007\21\200\0026\21\200\2\317\0\0\0"...,1624},{NULL,0},{"",0}],3) = 1624
poll([{fd=3,events=POLLIN}],revents=POLLIN}])
read(3,"\1\30\224Q\17\17\0\0\0\0\0\0\0\0\0\0000\235\273\0\0\0\0\0o\264Q\0\0\0\0\0"...,4096) = 4096
read(3,"\375\240f\0\376\242j\0\377\261\200\0\271a+\0\271a+\0\377\261\200\0\376\252w\0\376\250s\0"...,11356) = 11356
read(3,4096)               = -1 EAGAIN (Resource temporarily unavailable)
poll([{fd=3,[{"\230\32\7\0\1\21\200\2?\21\200\2\377\377\377\377\377\377\377\377\0\0\0\0\17\0\1\0015\10\4\0"...,956},3) = 956
poll([{fd=3,"\1\30\256Q\17\17\0\0\0\0\0\0\0\0\0\0000\235\273\0\0\0\0\0o\264Q\0\0\0\0\0"...,4096)               = -1 EAGAIN (Resource temporarily unavailable)
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
unlink("/home/userrrr/.mozilla/firefox/mvbnkitl.default/lock") = 0
rt_sigaction(SIGSEGV,{SIG_DFL,~[HUP INT QUIT ABRT BUS FPE KILL PIPE CHLD CONT TTOU URG Xcpu WINCH RT_1 RT_2 RT_3 RT_4 RT_8 RT_11 RT_14 RT_17 RT_22],SA_NOCLDSTOP},rt_sigprocmask(SIG_BLOCK,~[ILL ABRT BUS FPE SEGV RTMIN RT_1],~[KILL STOP RTMIN RT_1],8) = 0
open("/home/userrrr/.mozilla/firefox/mvbnkitl.default/minidumps/56b30367-5ee2-0495-32646b7f-59dc87e9.dmp",O_WRONLY|O_CREAT|O_EXCL,0600) = 63
clone(child_stack=0xf5bfffe4,flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_UNTRACED) = 18929
waitpid(18929,NULL,__WALL) = 18929
open("/proc/18913/task",O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 64
fstat64(64,{st_mode=S_IFDIR|0555,st_size=0,...}) = 0
getdents64(64,/* 12 entries */,1024)  = 368
ptrace(PTRACE_DETACH,18913,SIG_0)  = -1 ESRCH (No such process)
close(64)                               = 0
ftruncate(63,91256)                    = 0
close(63)                               = 0
rt_sigprocmask(SIG_SETMASK,8) = 0
time(NULL)                              = 1245590020
open("/home/userrrr/.mozilla/firefox/Crash Reports/LastCrash",O_WRONLY|O_CREAT|O_TRUNC,0600) = 63
write(63,"1245590020",10)             = 10

解决方法

伊万,你真正的问题是“如何调试SIGSEGV?”

strace在这里很少是一个很好的帮助. SIGSEGV意味着应用程序试图取消引用(访问)内存中尚未分配(或由于各种其他原因而不允许解除引用)的位置.机会很高,它与strace正在捕获的系统调用活动无关.为了发现崩溃的原因,首先要了解正在解除引用的地址以及尝试执行此操作的功能.调试器是执行此任务的正确工具.

这是你需要做的:

gdb <your_app_name> <your_coredump_file>

在那里,分析最后执行的指令并使用“信息寄存器”,你会看到有问题的地址.使用“bt”命令,您将看到callstack.通过遍历callstack,您将发现如何计算错误的地址.此地址计算中涉及的步骤之一是导致问题的原因.

调试很有趣,这是深入研究它的好机会.一本好书或一些在线文章可以帮助你.谷歌走了,祝你好运!

猜你在找的Linux相关文章