【问题标题】:Is it safe to use print command in gdb?在 gdb 中使用 print 命令是否安全?
【发布时间】:2018-01-14 16:35:04
【问题描述】:

我知道 gdb 允许通过print <exp> 命令打印表达式。据我了解,这种表达式的结果被保存到 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() 的结果?是否会释放变量的内存,会不会导致错误?

【问题讨论】:

    标签: c linux gdb


    【解决方案1】:

    Gdb 与调用函数并捕获结果没有什么不同。所以如果函数有分配内存等副作用,那么在gdb调用函数后,内存仍然是分配的。

    所以对于你foo3() 函数,内存将在堆上分配,直到你释放它(手动)。但这不是一种“不安全”的行为,它只会产生内存泄漏。如果这在您的调试环境中是可以接受的,那么就没有问题。如果您分配了大量内存但从未释放它,您将遇到“内存不足”问题。在小型嵌入式系统上,这可能是一个问题。

    gdb 本身永远不会释放任何内存。也许你想调用两个函数,第一个分配内存,第二个需要使用它。所以 gdb 不允许决定如何处理分配的存储。结果gdb不会释放内存!

    如果您打开文件、套接字或使用信号量,您将获得相同的效果。该文件不会被关闭或信号量不会被释放。作为用户,您必须知道在给定环境中调用了什么以及调用会产生什么副作用,不仅包括内存,还包括程序中的所有其他资源和状态。

    【讨论】:

      【解决方案2】:

      gdb 无法知道您的函数中有什么,因此无法决定 free 返回的指针。如果您要返回文字或 static 变量,则无需释放内存,因为不执行任何分配(释放它是错误的)。

      另一方面,第三个示例分配了一些内存,所以这是一种内存泄漏,是的,除非您能够从 gdb 调用另一个函数,例如 gdb 变量上的 free

      【讨论】:

      • 那么,据我所知gdb不会释放这样的变量? (更正确地说,变量指向的内存?
      • gdb 如何决定释放变量? C 中没有垃圾收集。
      • 是的,我的意思是一样的
      • "请注意,从 gdb 调用触发段错误的函数也会使调试器崩溃。" -- 这将是 GDB 中的一个错误,并且应该发生。
      • 让我删除它。这无关紧要
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多