C++ 我应该如何在一个大型的、不熟悉的软件项目中调试SIGFPE?
我正试图弄清KDE 5.6中的一个错误。不管我怎么锁,储物柜的屏幕都会坏。以下是相关代码: 当我运行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
/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”。