2011-10-12 113 views
7

我正在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。在這種情況下,我應該如何限制核心轉儲的大小?

回答

8

GDB不尊重'ulimit -c',只有內核纔會這樣做。

目標板上或開發主機上運行GDB(目標板上使用gdbserver)並不清楚。你可能應該使用後者,這將允許你收集完整的核心轉儲。

無論如何,截斷的核心轉儲都是一種痛苦,因爲經常它們不會包含您需要調試問題的完全信息。

+0

我在目標板上運行gdb。我也可以使用gdbserver,但由於崩潰不容易重現,因此我將使用第一個選項。 –

+1

對不起,但我看不到如何運行gdb或gdbserver作爲任何事情與崩潰很容易重現或不? – shodanex

+0

@shodanex - 使用客戶端 - 服務器模型,核心可以在「主機」文件系統上收集,而不是在嵌入式系統上收集,這裏只有180MB的可用空間供核心文件使用。推測主機系統有一個完整的硬盤,並且能夠保存一個更大的核心文件。 – Peter

0

你什麼時候使用ulimit -c?必須在啓動正在生成核心轉儲的程序之前以及在同一個會話中使用它。

+0

我在運行GDB之前設置了ulimit。我已經在/etc/rc.d/init.d/startup中放入'ulimit -c 50000',並且我也使用'ulimit -a'進行了手動檢查,並且設置正確。 –

4
在你的shell RC文件

limit coredumpsize 50000    # or whatever limit size you like 

應該設置的一切限制,包括GDB

注:

如果設置爲0,你可以確保你的主目錄不會與核心轉儲文件混雜在一起。