c++ - 使用 gcc/g++/gdb/valgrind 调试时的魔数(Magic Number)?

标签 c++ linux gcc valgrind

如果程序员自己没有初始化内存,Microsoft 的 Visual C++ 就会用“魔数(Magic Number)”填充内存。这有助于调试未初始化的内存。 (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如果您想更仔细地反射(reflect)它。

这适用于使用默认 C++ 分配器的任何内容,但不适用于使用常规旧 malloc() 的内容。如果您需要直接从 malloc() 初始化内存,您也可以覆盖它,但执行此操作的机制不同:您可以使用链接器的 --wrap 选项操作符号表并让您重写malloc()。那么你当然不需要重载operator new。完整的方法在此处的答案中进行了说明:https://stackoverflow.com/a/3662951/4323

关于c++ - 使用 gcc/g++/gdb/valgrind 调试时的魔数(Magic Number)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37090156/

相关文章:

c++ - BST插入、删除、搜索

c++ - 将矩阵 c\c++ API 与基于行的索引一起使用

c++ - 什么是复制省略和返回值优化?

linux - 使用 snmp 监控部署在 Tomcat 中的 J2EE 应用程序

linux - 无法从 putty 中使用curl 下载 tar.gz 文件 : EC2

c - 当给定 `strchr` 作为第一个参数时,C 标准库函数 `const char *` 如何返回指向非常量的指针?

c++ - Make -Wshadow 忽略初始化列表

c++ - 使用 MinGW 在 Windows 上编译 PDCurses

linux - 如何告诉 "gmake"使用另一个版本的 GCC? (Linux)

linux - 如何将两个独立但相似的代码库合并为一个 SVN 代表?