使用gcc / g ++ / gdb / valgrind进行调试时的魔术数字? [英] Magic numbers when debugging with gcc/g++/gdb/valgrind?
问题描述
使用linux GNU工具(g ++ / gdb)时是否有类似的功能?
谢谢!
void * operator new(size_t size)
{
void * mem = malloc(size);
if(!mem){
throw std :: bad_alloc();
}
memset(mem,0xEE,size);
返回mem;
$ / code>
你可以在这里看到完整的GCC实现: https://github.com/gcc -mirror / gcc / blob / master / libstdc%2B%2B-v3 / libsupc%2B%2B / new_op.cc ,以防你想更密切地镜像它。
这适用于任何使用默认C ++分配器的东西,但不适用于使用普通旧 malloc()
的东西。如果你需要直接从 malloc()
初始化内存,你可以重写它,但是执行它的机制是不同的:你可以使用链接器的 - wrap
选项来操作符号表,并让您覆盖 malloc()
。那么你当然不需要重载 operator new
。完整的方法在这里回答: https://stackoverflow.com/a/3662951/4323
Microsoft's Visual C++ fills memory with 'magic numbers' if it hasn't been initialized by the programmer itself. This helps with debugging of uninitialized memory. (In Visual Studio C++, what are the memory allocation representations?, 0xDEADBEEF vs. NULL)
Is there a similar function when using linux GNU tools (g++/gdb)?
Thanks!
You can override the C++ operator new
to set allocations to your preferred byte pattern:
void* operator new(size_t size)
{
void* mem = malloc(size);
if (!mem) {
throw std::bad_alloc();
}
memset(mem, 0xEE, size);
return mem;
}
You can see the full GCC implementation here: https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/libsupc%2B%2B/new_op.cc in case you want to mirror it more closely.
That will work for anything using the default C++ allocators, but not for things using regular old malloc()
. If you need to initialize memory from malloc()
directly, you can override that too, but the mechanism to do it is different: you can use the linker's --wrap
option to manipulate the symbol table and let you override malloc()
. Then you don't need to overload operator new
of course. The full approach is illustrated in an answer here: https://stackoverflow.com/a/3662951/4323
这篇关于使用gcc / g ++ / gdb / valgrind进行调试时的魔术数字?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!