2012-01-12 95 views
5

我可以配置進入Linux核心轉儲的內容嗎?我想獲得像Windows迷你轉儲(應用程序崩潰時有關棧幀的最少信息)之類的內容。我知道你可以使用ulimit來設置核心文件的最大尺寸,但是這不允許我控制核心內部的內容(即,不能保證如果將限制設置爲64kb,它將轉儲最後16頁的例如堆棧)。最小核心轉儲(堆棧跟蹤+僅當前幀)

另外,如果可能的話,我想以編程方式(從代碼)設置它。 我看過man core提到的/proc/PID/coredump_filter文件,但它對我的目的來說似乎過於粗糙。爲了提供一個小背景:我需要小型核心文件,原因有很多:我需要通過網絡爲大量(數千)客戶端收集它們;此外,這些是帶有少量SD卡的嵌入式設備,以及用於網絡連接的GPRS調制解調器。因此,大於200k的任何事情都不成問題。

編輯:我正在運行Linux 2.6.24的嵌入式設備上工作。處理器是PowerPC。不幸的是,PowerPC的Linux是目前在breakpad不支持,因此谷歌breakpad是不是一種選擇

+1

我不知道,答案可能在於內核源代碼(因爲沒有與此相關的規範)。你爲什麼要問?對於當前的磁盤,64Mb核心轉儲限制仍然很小,並且很可能包含足夠的信息。爲什麼你需要將極限設置爲64kb這樣的小數值。 ? – 2012-01-12 14:18:56

+3

Google Breakpad在包括Linux在內的所有平臺上編寫小型轉儲程序。 – 2012-01-12 14:38:39

+0

我問,因爲我正在使用一個嵌入式設備,它有一個小的閃存盤,尤其是一個緩慢的gprs連接來下載數據..我希望它儘可能小! – 2012-01-12 15:02:06

回答

5

我有「解決」這個問題有兩種方式:

  • 我爲SIGSEGV安裝了一個信號處理程序,並使用backtrace/backtrace_symbols打印出堆棧跟蹤。我用-rdynamic編譯我的代碼,所以即使剝離了調試信息後,我仍然使用有意義的名稱進行回溯(同時保持可執行文件足夠緊湊)。
    我剝去了調試信息,並把它放在一個單獨的文件中,我將它存儲在安全的地方,使用strip;從那裏,我將使用add22line與從回溯(地址)保存的信息來了解問題發生的位置。這樣我只需要存儲幾個字節。我發現我可以使用/ proc/self/coredump_filter轉儲沒有內存(設置其內容爲「0」):只有線程和proc信息,寄存器,堆棧跟蹤等保存在內核中。查看更多內容this answer
  • 我仍然失去可能是寶貴的信息(全局和局部變量的內容,params ..)。我很容易找出要轉儲的頁面,但不幸的是,沒有辦法爲普通的核心轉儲指定一個「dump-these-pages」(除非你願意去修補內核中的maydump()函數)。

    現在,我與有2個解決方案非常滿意(有總比沒有好。)我的下一步行動將是:

    • 看到多麼困難將端口Breakpad到PowerPC的Linux操作系統:已經有powerpc-darwin和i386-linux了......它有多難? :)
    • 嘗試使用google-coredumper轉儲只有幾個頁面周圍的當前ESP(應該給我當地人和參數)和「& some_global」(應該給我globals)。
    +0

    儘管fork google-coredumper並修改'WriteCoreDump'函數以轉儲特定頁面/地址會很簡單..它不支持powerpc :( – 2013-04-12 13:39:58