我想知道调试我遇到困难的SEGV的当前sbrk()
限制是多少。我的代码看起来不错,在大多数情况下都可以工作(在SEGV的许多中断中只有一个情况(。
我认为这可能与在这种情况下我们使用多线程应用程序的事实有关,但我现在无法确定问题所在。我想将SEGV地址与sbrk()
限制进行比较,看看地址有多差。我认为这可能是一个mmap()
或一些类似的地址,在我脚下被删除。
如果进程仍然具有有效的堆栈,则可以从libc调用sbrk
函数:
(gdb) print ((void *(*) (unsigned long)) sbrk)(0)
$1 = (void *) 0x55555580e000
如果 GDB 能够加载 libc 的调试信息,则不需要强制转换。
(如果sbrk
根本没有链接到程序中,这可能不适用于静态链接的二进制文件。
原则上,它适用于GDB可以找到符号的任何函数。但是从 GDB 调用特定函数是否安全取决于程序停止的确切位置(例如,从 malloc 中调用 malloc 通常是一个坏主意(。