我应该如何在一个大型的,不熟悉的软件项目中调试SIGFPE?

时间:2016-03-30 21:33:37

标签: c++ debugging gdb kde

我正试图深入了解KDE 5.6中的错误。无论我如何锁定它,锁屏都会破裂。以下是相关代码:https://github.com/KDE/kscreenlocker/blob/master/abstractlocker.cpp#L51

当我运行KCrash: Application 'kscreenlocker_greet' crashing... Floating point exception (core dumped) 时,我得到一个输出:

gdb

我正在尝试使用KCrash运行它来尝试确定错误的确切位置,但我不确定在哪里设置断点以隔离错误。我应该寻找raise()的电话吗?或者是gdb来电?我可以让scenarioName打印导致SIGFPE的相关代码行吗?

感谢您提供任何建议。

1 个答案:

答案 0 :(得分:1)

  

但我不知道在哪里设置断点以隔离错误

您根本不需要设置任何断点:当在GDB下运行的进程遇到致命信号(例如SIGFPE)时,操作系统会注意到调试器正在跟踪该进程,并通知调试器(而不是终止进程)。这反过来导致GDB停止,并提示您输入其他命令。 当时,您可以环顾四周,了解导致崩溃的原因。

示例:

cat -n t.c
     1  #include <fenv.h>
     2
     3  int foo(double d) {
     4    return 1/d;
     5  }
     6
     7  int main()
     8  {
     9    feenableexcept(FE_DIVBYZERO);
    10    return foo(0);
    11  }

gcc -g t.c -lm
./a.out
Floating point exception

gdb -q ./a.out
(gdb) run
Starting program: /tmp/a.out

Program received signal SIGFPE, Arithmetic exception.
0x000000000040060e in foo (d=0) at t.c:4
4     return 1/d;
(gdb) bt
#0  0x000000000040060e in foo (d=0) at t.c:4
#1  0x0000000000400635 in main () at t.c:10
(gdb) q

在这里,正如您所看到的,GDB在SIGFPE交付时停止,并允许您环顾四周并了解崩溃。

在您的情况下,您可能希望首先为KDE安装debuginfo符号,然后运行

gdb --args /usr/lib/kscreenlocker_greet --testing
(gdb) run