Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该如何在一个大型的、不熟悉的软件项目中调试SIGFPE?_C++_Debugging_Gdb_Kde - Fatal编程技术网

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

C++ 我应该如何在一个大型的、不熟悉的软件项目中调试SIGFPE?,c++,debugging,gdb,kde,C++,Debugging,Gdb,Kde,我正试图弄清KDE 5.6中的一个错误。不管我怎么锁,储物柜的屏幕都会坏。以下是相关代码: 当我运行/usr/lib/kscreenlocker\u greet--testing时,我得到以下输出: KCrash: Application 'kscreenlocker_greet' crashing... Floating point exception (core dumped) 我正在尝试使用gdb运行它,以尝试锁定错误的确切位置,但我不确定在哪里设置断点以隔离错误。我是否应该寻找呼叫KC

我正试图弄清KDE 5.6中的一个错误。不管我怎么锁,储物柜的屏幕都会坏。以下是相关代码:

当我运行
/usr/lib/kscreenlocker\u greet--testing
时,我得到以下输出:

KCrash: Application 'kscreenlocker_greet' crashing...
Floating point exception (core dumped)
我正在尝试使用
gdb
运行它,以尝试锁定错误的确切位置,但我不确定在哪里设置断点以隔离错误。我是否应该寻找呼叫
KCrash
?或者是一个
raise()
调用?我可以让
gdb
打印导致SIGFPE的相关代码行吗

谢谢你提供的任何建议

但是我不确定在哪里设置断点来隔离bug

您根本不需要设置任何断点:当在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
但是我不确定在哪里设置断点来隔离bug

您根本不需要设置任何断点:当在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下运行程序,当程序崩溃时,输入“bt”。在gdb下运行程序,当程序崩溃时,输入“bt”。