Linux:如何debuggingSIGSEGV? 如何跟踪错误来源?

我的Firefox从今天开始崩溃。 我没有改变任何系统或Firefox上的configuration。

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

我在两个生成的过程转储中看到了段错误,但是我怎么能跟踪他们的原因?

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

这是输出的一个片段,你可以在其中看到实际的SIGSEGV。

阅读(19,“\ 372”,1)= 1
 gettimeofday({1245590019,542231},NULL)= 0
 (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
读取(3,0xf5c55058,4096)= -1 EAGAIN(资源暂时不可用)
 gettimeofday({1245590019,542813},NULL)= 0
 poll([{fd = 4,events = POLLIN},{fd = 3,events = POLLIN},{fd = 8,events = POLLIN | POLLPRI},{fd = 12,events = POLLIN | POLLPRI} {fd = 13,events = POLLIN | POLLPRI},{fd = 14,events = POL
读取(3,0xf5c55058,4096)= -1 EAGAIN(资源暂时不可用)
 gettimeofday({1245590019,543161},NULL)= 0
 gettimeofday({1245590019,546672},NULL)= 0
 gettimeofday({1245590019,546761},NULL)= 0
读取(3,0xf5c55058,4096)= -1 EAGAIN(资源暂时不可用)
 gettimeofday({1245590019,546936},NULL)= 0
 poll([{fd = 4,events = POLLIN},{fd = 3,events = POLLIN},{fd = 8,events = POLLIN | POLLPRI},{fd = 12,events = POLLIN | POLLPRI} {fd = 13,events = POLLIN | POLLPRI},{fd = 14,events = POL
轮询([{fd = 3,events = POLLIN | POLLOUT}],1,44294967295)= 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 \ ...,1624},{NULL,0},{“”,0}],3)= 1624
 poll([{fd = 3,events = POLLIN}],1,44294967295)= 1([{fd = 3,revents = POLLIN}])
 (3,“\ 1 \ 30 \ 224Q \ 17 \ 17 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0000 \ 235 \ 273 \ 0 \ 0 \ 0 \ 0 \ 264Q \ 0 \ 0 \ 0 \ 0 \ 0“...,4096)= 4096
 (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
读取(3,0xf5c55058,4096)= -1 EAGAIN(资源暂时不可用)
轮询([{fd = 3,events = POLLIN | POLLOUT}],1,44294967295)= 1([{fd = 3,revents = POLLOUT}])
 writev(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},{NULL,0},{”“,0}],3)= 956
 poll([{fd = 3,events = POLLIN}],1,44294967295)= 1([{fd = 3,revents = POLLIN}])
 (3,“\ 1 \ 30 \ 256Q \ 17 \ 17 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0000 \ 235 \ 273 \ 0 \ 0 \ 0 \ 0 \ 264Q \ 0 \ 0 \ 0 \ 0 \ 0“...,4096)= 4096
 (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
读取(3,0xf5c55058,4096)= -1 EAGAIN(资源暂时不可用)
 --- SIGSEGV(分段错误)@ 0(0)---
取消链接(“/ home / userrrr / .mozilla / firefox / mvbnkitl.default / lock”)= 0
 ig_sigaction(SIGSEGV,{SIG_DFL,〜[HUP INT QUIT ABRT BUS FPE KILL PIPE CHLD CONT TTOU URG XCPU WINCH RT_1 RT_2 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
打开(“/ 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
打开(“/ 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,0,SIG_0)= -1 ESRCH(没有这样的过程)
closures(64)= 0
 ftruncate(63,91256)= 0
closures(63)= 0
 rt_sigprocmask(SIG_SETMASK,〜[KILL STOP RTMIN RT_1],〜[KILL STOP RTMIN RT_1],8)= 0
时间(NULL)= 1245590020
打开(“/ home / userrrr / .mozilla / firefox /崩溃报告/ LastCrash”,O_WRONLY | O_CREAT | O_TRUNC,0600)= 63
写(63,“1245590020”,10)= 10

Solutions Collecting From Web of "Linux:如何debuggingSIGSEGV? 如何跟踪错误来源?"

伊凡,你真正的问题是“我如何调试一个SIGSEGV?”

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

这是你需要做的:

  gdb <your_app_name> <your_coredump_file> 

在那里,分析上一次执行的指令,并使用“信息寄存器”,你会看到有问题的地址。 使用“bt”命令你会看到这个callstack。 通过漫游,你会发现如何计算错误的地址。 计算地址所涉及的步骤之一就是问题的原因。

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

你可以用调试模式启动firefox:firefox -d gdb

这将在gdb中启动firefox。

你可以问题的gdb命令“运行”,并得到一个追溯当firefox崩溃。 这可能是困难的,因为firefox带有剥离库,它只显示代码所在的库和偏移量,而不是函数名称。

另一种方法是以安全模式启动firefox:firefox -safe-mode并关闭所有你可能已经安装的插件,直到它不再崩溃。

最后一种方法是启用firefox的开发者模式,并允许它发送Firefox的崩溃会话到Mozilla服务器。 然后,你可以去到Mozilla网站,看到你的失败的Firefox会话的详细回溯。