使用 gcc/g++/gdb/valgrind 调试时的幻数?
Magic numbers when debugging with gcc/g++/gdb/valgrind?
如果程序员自己没有初始化,Microsoft 的 Visual C++ 会用 'magic numbers' 填充内存。这有助于调试未初始化的内存。 (In Visual Studio C++, what are the memory allocation representations?, 0xDEADBEEF vs. NULL)
使用linux GNU工具(g++/gdb)有没有类似的功能?
谢谢!
您可以覆盖 C++ operator new
以将分配设置为您首选的字节模式:
void* operator new(size_t size)
{
void* mem = malloc(size);
if (!mem) {
throw std::bad_alloc();
}
memset(mem, 0xEE, size);
return mem;
}
您可以在此处查看完整的 GCC 实现:https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/libsupc%2B%2B/new_op.cc 如果您想更接近地镜像它。
这适用于任何使用默认 C++ 分配器的东西,但不适用于使用常规旧 malloc()
的东西。如果您需要直接从 malloc()
初始化内存,您也可以覆盖它,但实现它的机制不同:您可以使用链接器的 --wrap
选项来操作符号 table 和让你覆盖 malloc()
。那么你当然不需要重载 operator new
。此处的答案说明了完整的方法:
如果程序员自己没有初始化,Microsoft 的 Visual C++ 会用 'magic numbers' 填充内存。这有助于调试未初始化的内存。 (In Visual Studio C++, what are the memory allocation representations?, 0xDEADBEEF vs. NULL)
使用linux GNU工具(g++/gdb)有没有类似的功能?
谢谢!
您可以覆盖 C++ operator new
以将分配设置为您首选的字节模式:
void* operator new(size_t size)
{
void* mem = malloc(size);
if (!mem) {
throw std::bad_alloc();
}
memset(mem, 0xEE, size);
return mem;
}
您可以在此处查看完整的 GCC 实现:https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/libsupc%2B%2B/new_op.cc 如果您想更接近地镜像它。
这适用于任何使用默认 C++ 分配器的东西,但不适用于使用常规旧 malloc()
的东西。如果您需要直接从 malloc()
初始化内存,您也可以覆盖它,但实现它的机制不同:您可以使用链接器的 --wrap
选项来操作符号 table 和让你覆盖 malloc()
。那么你当然不需要重载 operator new
。此处的答案说明了完整的方法: