debugging 在C++中使用nan初始化内存以进行调试

5sxhfpxr  于 2023-10-24  发布在  其他
关注(0)|答案(4)|浏览(169)

如何在启动时将c或c++程序中的所有内存初始化为NaN(Not-A-Number),以便使用gdb进行调试?
我相信默认情况下gdb会使用零来替换,但这通常对查找由于初始化错误而崩溃的代码没有帮助。
附言:我想把每个变量和数组初始化为NAN(或者一些垃圾),只是为了调试。我正在使用的程序有数千个变量,所以改变每个变量相当繁琐。

smtd7mpg

smtd7mpg1#

这些十六进制数字在Rafael的帖子中可能是正确的,但我会推荐一种更语义化的方法。
参见http://en.cppreference.com/w/cpp/types/numeric_limits/quiet_NaN

#include <limits>
double nan1 = std::numeric_limits<double>::quiet_NaN();
double nan2 = std::numeric_limits<double>::signaling_NaN();

注意,有两种NaN。

yftpprvb

yftpprvb2#

您可以将浮点数转换为32位整数,并将其设置为

0x7FC00000 and 0x7FFFFFFF or 
0xFFC00000 and 0xFFFFFFFF

对于转换为u64的双精度数,并将其设置为

0x7FF8000000000000 and 0x7FFFFFFFFFFFFFFF or 
0xFFF8000000000000 and 0xFFFFFFFFFFFFFFFF
mbjcgjjk

mbjcgjjk3#

你说的“初始化所有内存”是什么意思?这可能只在一些裸金属嵌入式系统上可行,而在Linux中是不可能的。
每个程序都有两个相关的特殊内存区域:一个是零初始化,当然需要用零填充。这些变量被分配在标记为零的区域内,它们的值不存储在可执行文件中。另一个是初始化为某个显式定义的值。这些值存储在可执行文件中。
虽然应该可以获得这个区域的边界(就像C库代码一样),但问题是,为什么要用NaN填充零初始化区域。这会在代码的其他地方产生不必要的副作用。例如,如果您有一个初始化为0的全局int,用NaN填充这个区域也会将该整数的初始值更改为完全意外的值。
如果你需要一些变量或数组初始化为NaN,只需在声明它们时适当地初始化变量(如Notinlist和Rafael所解释的那样)。

#define NaNdouble(X) double X = std::numeric_limits<double>::quiet_NaN();
rkkpypqq

rkkpypqq4#

我方便地使用memset,值为-1。它适用于任何浮点类型。

#include <string.h>
float x[5];
memset(x, -1, sizeof(x));

在之前发布的答案中,这种方法没有被明确提及。

相关问题