
我用
strace -ff -o dumpfile.txt firefox
追踪问题.这不是一个很大的帮助.
我在两个生成的进程转储中看到了segfault,
但我如何能够追溯他们的原因呢?
运行10秒后崩溃,
strace生成22MB的数据.
这是输出的片段,您可以在中间看到实际的SIGSEGV:
read(19,"2",1) = 1gettimeofday({1245590019,542231},NulL) = 0read(3,"gdb <your_app_name> <your_coredump_file>
[QmyY03A3(",4096) = 32read(3,0xf5c55058,4096) = -1 EAGAIN (Resource temporarily unavailable)gettimeofday({1245590019,542813},NulL) = 0poll([{fd=4,events=PolliN},{fd=3,{fd=8,events=PolliN|PolLPRI},{fd=12,{fd=13,{fd=14,events=Polread(3,543161},NulL) = 0gettimeofday({1245590019,546672},546761},546936},events=Polpoll([{fd=3,events=PolliN|PolLOUT}],1,4294967295) = 1 ([{fd=3,revents=PolLOUT}])writev(3,[{"50606\n0]00702607"...,1624},{NulL,0},{"",0}],3) = 1624poll([{fd=3,events=PolliN}],revents=PolliN}])read(3,"4Q0053o4Q"...,4096) = 4096read(3,"50f62j7101a+1a+71062w60s"...,11356) = 11356read(3,4096) = -1 EAGAIN (Resource temporarily unavailable)poll([{fd=3,[{"00?07777777715"...,956},3) = 956poll([{fd=3,"6Q0053o4Q"...,4096) = -1 EAGAIN (Resource temporarily unavailable)--- SIGSEGV (Segmentation fault) @ 0 (0) ---unlink("/home/userrrr/.mozilla/firefox/mvbnkitl.default/lock") = 0rt_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) = 0open("/home/userrrr/.mozilla/firefox/mvbnkitl.default/minIDumps/56b30367-5ee2-0495-32646b7f-59dc87e9.dmp",O_WRONLY|O_CREAT|O_EXCL,0600) = 63clone(child_stack=0xf5bfffe4,flags=CLONE_VM|CLONE_FS|CLONE_fileS|CLONE_UNTRACED) = 18929waitpID(18929,NulL,__WALL) = 18929open("/proc/18913/task",O_RDONLY|O_NONBLOCK|O_LARGEfile|O_DIRECTORY|O_CLOEXEC) = 64fstat64(64,{st_mode=S_IFDIR|0555,st_size=0,...}) = 0getdents64(64,/* 12 entrIEs */,1024) = 368ptrace(PTRACE_DETACH,18913,SIG_0) = -1 ESRCH (No such process)close(64) = 0ftruncate(63,91256) = 0close(63) = 0rt_sigprocmask(SIG_SETMASK,8) = 0time(NulL) = 1245590020open("/home/userrrr/.mozilla/firefox/Crash Reports/LastCrash",O_WRONLY|O_CREAT|O_Trunc,0600) = 63write(63,"1245590020",10) = 10解决方法 伊万,你真正的问题是“如何调试SIGSEGV?” strace在这里很少是一个很好的帮助. SIGSEGV意味着应用程序试图取消引用(访问)内存中尚未分配(或由于各种其他原因而不允许解除引用)的位置.机会很高,它与strace正在捕获的系统调用活动无关.为了发现崩溃的原因,首先要了解正在解除引用的地址以及尝试执行此 *** 作的功能.调试器是执行此任务的正确工具.
这是你需要做的:
在那里,分析最后执行的指令并使用“信息寄存器”,你会看到有问题的地址.使用“bt”命令,您将看到callstack.通过遍历callstack,您将发现如何计算错误的地址.此地址计算中涉及的步骤之一是导致问题的原因.
调试很有趣,这是深入研究它的好机会.一本好书或一些在线文章可以帮助你.谷歌走了,祝你好运!
总结以上是内存溢出为你收集整理的Linux:如何调试SIGSEGV?如何跟踪错误源?全部内容,希望文章能够帮你解决Linux:如何调试SIGSEGV?如何跟踪错误源?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)