是否有一个命令在 gdb
我是否可以运行一个命令,使它在第一次出现NaN或inf赋值时自动停止(中断),也就是当执行的赋值的RHS是NaN或inf时(例如,当我把某个东西除以0并试图把结果赋值给一个变量时)?
在Linux的gcc中,你可以将浮点异常变为 SIGFPE
信号。你可以叫 feenableexcept(FE_DIVBYZERO)
来捕获代码中所有后续的浮点除法为零。如果你在gdb中运行这段代码,它将停止在 SIGFPE
信号,这是大多数其他信号的默认行为。这也是大多数其他信号的默认行为,这段代码是从这里摘取并修改的。https:/stackoverflow.coma294945272178。
#define _GNU_SOURCE
#include <fenv.h>
int main(void) {
double x, y, z;
feenableexcept(FE_DIVBYZERO);
x = 1;
y = 0;
z = x / y;
return 0;
}
gdb会在除以零时停止。
$ gdb -q ./a.out
Reading symbols from ./a.out...
(gdb) r
Program received signal SIGFPE, Arithmetic exception.
0x0000000000401153 in main () at 1.c:10
10 z = x / y;
(gdb)
在许多方面: NaN
是一个和其他值一样的值。因此,我不相信在每一种情况下都能让它产生一个特殊事件。
根据你所编程的架构,可能会有一个 减法 但请注意,被零除数除以的数并不是产生一个 NaN
值。(同样取决于架构)执行另一个操作,用一个 NaN
操作数可能会引发一个 eventexception (例如,"无效操作")。这可能会指向一些方向,通过在调试下的系统中添加一些代码来生成一个gdb断点(如果这是一个选项)。
除了来自异常事件的触发器,条件看点也可能是一个选项:如果你不只是在寻找 NaN
价值观 任何地方在某一变量上设置一个观察点,限制在某一条件下,可以是一个很好的解决方案。
在某些情况下,这两种想法都不会对你有进一步的帮助:例如,如果 NaN
在HPC环境下,在一些地方出现了错误(或不稳定)的数值实现,额外的数值操作和条件断点watchpoints通常是不可行的,因为开销会在计算生成之前就 "扼杀 "计算 NaN
价值。