我们使用 Python、Java 和 C++ 混合编写的进程会不时进行核心转储。它们在运行时根据需要分块分配更多内存,并且当它们的分配超过 4G 时就会崩溃(我猜malloc()
未检查返回值)。
然而,根据 GDB 的说法,生成的核心转储会被截断 - 它们在操作系统中的大小没有限制,在磁盘上的大小在 2-3.8G 之间变化。
GDB 观察到大小与预期不符(大概包括失败的分配?)并放弃 - 但在 3.8G 的数据中肯定存在某物出于兴趣?甚至可能是我需要回溯的整个堆栈!
我怎样才能说服 GDB 至少尝试一下,或者是否有替代工具可以从截断的核心中提取某些内容?
答案1
Sun Studio 12 网站上的这个简介似乎暗示它们基本上没有用。
摘录-http://docs.oracle.com/cd/E19205-01/819-5257/blabs/index.html如果您的核心文件被截断
如果加载核心文件时遇到问题,请检查核心文件是否被截断。如果创建核心文件时将核心文件的最大允许大小设置得太低,则 dbx 无法读取生成的截断核心文件。在 C shell 中,您可以使用 limit 命令设置允许的最大核心文件大小(请参阅 limit(1) 手册页)。在 Bourne shell 和 Korn shell 中,使用 ulimit 命令(请参阅 limit(1) 手册页)。您可以更改 shell 启动文件中核心文件大小的限制,重新启动启动文件,然后重新运行生成核心文件的程序以生成完整的核心文件。
如果核心文件不完整,并且堆栈段丢失,则堆栈跟踪信息不可用。如果运行时链接器信息丢失,则加载对象列表不可用。在这种情况下,您会收到有关 librtld_db.so 未初始化的错误消息。如果缺少 LWP 列表,则没有可用的线程信息、lwp 信息或堆栈跟踪信息。如果运行 where 命令,您会收到一条错误,指出程序未“活动”。