我可以在 gdb 中获取当前的 sbrk() 限制吗?

Can I get the current sbrk() limit in gdb?

我想知道当前的 sbrk() 限制是什么来调试我遇到困难的 SEGV。我的代码看起来不错,并且在大多数情况下都能正常工作(SEGV 造成的许多中断中只有一种情况。)

我认为它可能在 link 中,因为在这种情况下我们使用多线程应用程序,但我现在无法确定问题所在。我想将 SEGV 地址与 sbrk() 限制进行比较,以查看该地址有多偏离。我想它可能是一个 mmap() 或一些类似的地址,它在我脚下被删除了。

如果进程仍然有一个有效的堆栈,您可以从 libc 中调用 sbrk 函数:

(gdb) print ((void *(*) (unsigned long)) sbrk)(0)
 = (void *) 0x55555580e000

如果 GDB 能够加载 libc 的调试信息,则不需要转换。

(如果 sbrk 根本没有链接到程序中,这可能不适用于静态链接的二进制文件。)

原则上它适用于 GDB 可以找到符号的任何函数。但是从 GDB 调用特定函数是否安全取决于程序停止的确切位置(例如,从 malloc 内部调用 malloc 通常是个坏主意)。