我知道gdb允许通过print <exp>
命令打印表达式。据我所知,这种exression的结果被保存到gdb变量(可以用$N - N - number of variable
加入。打印函数执行结果是否安全?假设我有函数:
const char* foo(){ return "foo";}
char* foo2(){static char b[10]; /*change b*/; return b}
char* foo3(){char* b; /*Create string on heap*/ return b;}
gdb如何处理print foo(), print foo2(), print foo3()
的结果?它会释放变量的内存吗?它会导致错误吗?
答案 0 :(得分:3)
Gdb没有什么不同于调用函数并捕获结果。因此,如果该函数具有分配内存等副作用,则在从gdb调用函数后仍然会分配内存。
因此,对于foo3()
函数,内存将在堆上分配,直到您将其释放(手动)。但这不是一个不安全的&#34;行为,它只会产生内存泄漏。如果在调试环境中可以接受,则没有问题。如果您分配了大量的内存但从未释放它,那么您将在内存中运行&#34;内存不足&#34;问题。在小型嵌入式系统上,这可能是一个问题。
gdb本身永远不会释放任何内存。也许你想调用两个函数,第一个分配内存,第二个需要使用它。因此不允许gdb决定如何处理分配的存储。结果gdb不会释放内存!
如果您打开文件,套接字或使用信号量,则会产生相同的效果。该文件不会被关闭或信号量不会被释放。您作为用户必须知道您呼叫的内容以及您的呼叫将在给定环境中产生的副作用,不仅包括内存,还包括您的prog中的所有其他资源和状态。
答案 1 :(得分:2)
gdb
无法知道函数中的内容,因此无法决定free
返回的指针。如果您返回文字或static
变量,则无需释放内存,因为不执行任何分配(释放它将是一个错误)。
另一方面,第三个例子分配了一些内存,所以它是一种内存泄漏,是的,除非你能够从gdb
调用另一个函数,如{{1在gdb变量上。