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

时间:2019-03-25 00:44:56

标签: gdb sigsegv sbrk

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

我认为这可能与以下事实有关:在这种情况下,我们使用多线程应用程序,但我现在无法确定问题所在。我想将SEGV地址与sbrk()限制进行比较,以查看该地址的情况。我想这可能是mmap()或其他类似的地址,但我的脚下却将其删除。

1 个答案:

答案 0 :(得分:2)

如果进程仍然具有有效的堆栈,则可以从libc调用sbrk函数:

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

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

(如果根本没有将sbrk链接到程序中,则该方法不适用于静态链接的二进制文件。)

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