如何在使用GDB生成核心转储文件时限制核心转储文件的大小
问题描述:
我正在ARM9开发板上运行嵌入式应用程序,其中总闪存大小仅为180MB。我能够运行gdb
,但是当我做如何在使用GDB生成核心转储文件时限制核心转储文件的大小
(gdb) generate-core-dump
我得到一个错误
warning: Memory read failed for corefile section, 1048576 bytes at 0x4156c000.
warning: Memory read failed for corefile section, 1048576 bytes at 0x50c00000.
Saved corefile core.5546
The program is running. Quit anyway (and detach it)? (y or n) [answered Y; input not from terminal]
Tamper Detected
**********OUTSIDE ifelse 0*********
length validation is failed
我还设置ulimit -c 50000
,但仍是核心转储超过此限制。当我做ls -l
检查文件大小时,它超过300 MB。在这种情况下,我应该如何限制核心转储的大小?
答
GDB不尊重'ulimit -c',只有内核才会这样做。
目标板上或开发主机上运行GDB(目标板上使用gdbserver)并不清楚。你可能应该使用后者,这将允许你收集完整的核心转储。
无论如何,截断的核心转储都是一种痛苦,因为经常它们不会包含您需要调试问题的完全信息。
答
你什么时候使用ulimit -c?必须在启动正在生成核心转储的程序之前以及在同一个会话中使用它。
+0
我在运行GDB之前设置了ulimit。我已经在/etc/rc.d/init.d/startup中放入'ulimit -c 50000',并且我也使用'ulimit -a'进行了手动检查,并且设置正确。 –
答
在你的shell RC文件
:
limit coredumpsize 50000 # or whatever limit size you like
应该设置的一切限制,包括GDB
注:
如果设置为0,你可以确保你的主目录不会与核心转储文件混杂在一起。
我在目标板上运行gdb。我也可以使用gdbserver,但由于崩溃不容易重现,因此我将使用第一个选项。 –
对不起,但我看不到如何运行gdb或gdbserver作为任何事情与崩溃很容易重现或不? – shodanex
@shodanex - 使用客户端 - 服务器模型,核心可以在“主机”文件系统上收集,而不是在嵌入式系统上收集,这里只有180MB的可用空间供核心文件使用。推测主机系统有一个完整的硬盘,并且能够保存一个更大的核心文件。 – Peter