C “如何调试”;“内存不足”;从核心?
我从g_ascii_strdown()得到一个内核,它说它在执行malloc()时出错,然后崩溃了。所以,如果进程遇到内存不足的情况,有没有办法从core和gdb中找出程序的哪个部分(调用方、堆栈或线程)分配了内存C “如何调试”;“内存不足”;从核心?,c,debugging,gdb,C,Debugging,Gdb,我从g_ascii_strdown()得到一个内核,它说它在执行malloc()时出错,然后崩溃了。所以,如果进程遇到内存不足的情况,有没有办法从core和gdb中找出程序的哪个部分(调用方、堆栈或线程)分配了内存 换句话说,如果我有核心文件。核心文件中存在哪些类型的信息可以用来查找内存分配?一般来说,malloc不保存任何簿记信息,这些信息可以让您确定程序的哪些部分分配了内存。由于该信息不在实时进程中,因此也不会在核心转储中 如果您想弄清楚这一点,您需要使用一些mallocdebug库/程序。
换句话说,如果我有核心文件。核心文件中存在哪些类型的信息可以用来查找内存分配?一般来说,
malloc
不保存任何簿记信息,这些信息可以让您确定程序的哪些部分分配了内存。由于该信息不在实时进程中,因此也不会在核心转储中
如果您想弄清楚这一点,您需要使用一些malloc
debug库/程序。我通常建议这样做,因为它包含一个优秀的malloc
调试器,但是Valgrind只在活动进程上工作。可能有一些可供选择的malloc
库,您可以对其进行链接,这些库将这些信息保存在核心转储中,但如果有,我不能说我知道它。闻起来像是一些。用于显示问题的可重复运行(您需要在valgrind
下再次启动程序)。您可能无法单独使用core
dump在验尸后找到问题
顺便说一句,文档还建议在启动时很早调用g_mem_set_vtable(glib_mem_profiler_table)
(在main的开头)
另见
最后,知道哪部分内存耗尽并不重要。可用内存是一个完整的过程。运行pid 1234程序时,请使用cat/proc/1234/maps
&请参见您的问题有点不清楚。“计算出所有分配的内存”是什么意思?您到底想做什么?我想知道进程/程序的哪个部分分配了多少。@spa,核心是崩溃时程序状态的转储,您需要系统状态。它们完全不同——要收集系统状态,您需要设置基本的监控,如collectl
,等等(或收集系统核心a.k.a.crashdump/kdump/等等)。我有核心文件。核心文件中有什么样的信息可以用来找出内存分配。这是什么样的程序?你应该编辑你的问题来改进它!