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

问题描述 投票:1回答:1

我想知道当前的sbrk()限制是调试SEGV我很难用。我的代码看起来很好并且在大多数情况下都有效(在SEGV的很多中断中只有一个案例。)

我认为它可能与这样的事实相关联:在这种情况下,我们使用多线程应用程序,但我现在无法查明问题。我想比较SEGV地址和sbrk()限制,看看地址是多少。我想它可能是一个mmap()或一些类似的地址,在我的脚下被删除。

gdb sigsegv sbrk
1个回答
2
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.