我可以在 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 通常是个坏主意)。
我想知道当前的 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 通常是个坏主意)。