在gdb中是否可以在inf的第一次赋值时中断执行?

问题描述 投票:3回答:2

是否有一个命令在 gdb 我是否可以运行一个命令,使它在第一次出现NaN或inf赋值时自动停止(中断),也就是当执行的赋值的RHS是NaN或inf时(例如,当我把某个东西除以0并试图把结果赋值给一个变量时)?

c gdb nan
2个回答
2
投票

在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) 

0
投票

在许多方面: NaN是一个和其他值一样的值。因此,我不相信在每一种情况下都能让它产生一个特殊事件。

根据你所编程的架构,可能会有一个 减法 但请注意,被零除数除以的数并不是产生一个 NaN 值。(同样取决于架构)执行另一个操作,用一个 NaN 操作数可能会引发一个 eventexception (例如,"无效操作")。这可能会指向一些方向,通过在调试下的系统中添加一些代码来生成一个gdb断点(如果这是一个选项)。

除了来自异常事件的触发器,条件看点也可能是一个选项:如果你不只是在寻找 NaN 价值观 任何地方在某一变量上设置一个观察点,限制在某一条件下,可以是一个很好的解决方案。

在某些情况下,这两种想法都不会对你有进一步的帮助:例如,如果 NaN 在HPC环境下,在一些地方出现了错误(或不稳定)的数值实现,额外的数值操作和条件断点watchpoints通常是不可行的,因为开销会在计算生成之前就 "扼杀 "计算 NaN 价值。

© www.soinside.com 2019 - 2024. All rights reserved.