从今天开始,我的Firefox开始崩溃。我没有在系统或Firefox配置上进行任何更改。

我用
strace -ff -o dumpfile.txt firefox
找出问题所在。这不是很大的帮助。

我在两个生成的进程转储中看到了段错误,
但是我如何跟踪他们的原因呢?

运行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(资源暂时不可用)
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
read(3,0xf5c55058,4096)= -1 EAGAIN(资源暂时不可用)
gettimeofday({1245590019,543161},NULL)= 0
gettimeofday({1245590019,546672},NULL)= 0
gettimeofday({1245590019,546761},NULL)= 0
read(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
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}],1,4294967295)= 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\0o\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
read(3,0xf5c55058,4096)= -1 EAGAIN(资源暂时不可用)
poll([{fd = 3,events = POLLIN | POLLOUT}],1,4294967295)= 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\377\0\0\0\0\17\0\1\0015\10\4\0“...,956},{NULL,0},{”“,0}],3)= 956
poll([{fd = 3,events = POLLIN}],1,4294967295)= 1([{{fd = 3,revents = POLLIN}])
读取(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)= 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
read(3,0xf5c55058,4096)= -1 EAGAIN(资源暂时不可用)
--- SIGSEGV(分段故障)@ 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
打开(“/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个条目*/,1024)= 368
ptrace(PTRACE_DETACH,18913,0,SIG_0)= -1 ESRCH(没有这样的过程)
关闭(64)= 0
ftruncate(63,91256)= 0
收盘价(63)= 0
rt_sigprocmask(SIG_SETMASK,〜[KILL STOP RTMIN RT_1],〜[KILL STOP RTMIN RT_1],8)= 0
时间(NULL)= 1245590020
打开(“/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”命令,您将看到调用堆栈。通过向上调用堆栈,您将发现如何计算错误的地址。地址计算中涉及的步骤之一就是造成问题的原因。

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

关于Linux:如何调试SIGSEGV?如何跟踪错误源?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1023882/

10-13 09:47