2017-07-24 97 views
0

我試圖在服務器上對一個問題進行一些調試,我懷疑這個問題與緩衝區溢出有關,所以我試圖編譯我的代碼-fsanitize=address以啓用地址清理。gcc地址sanitizer核心轉儲出錯

它被編譯,並生成軟件運行。但是,當地址清理程序檢測到錯誤時,我試圖獲得核心轉儲,因爲這幾乎是我可以通過設置從系統中獲取信息的唯一方式。

我在命令行中使用ASAN_OPTIONS=abort_on_error=1作爲前綴(使用shell腳本來執行此操作),並檢查ulimit -c的結果是無限的,但它不會產生核心轉儲。

我錯過了什麼?

這是一個Ubuntu 14.04服務器與gcc版本4.8.4上

編輯:sysctl kernel.core_pattern還給kernel.core_pattern = |/usr/share/apport/apport %p %s %c %P。這可能意味着apport已啓用(至少以某種形式)。但是,我已經能夠從軟件中的斷言和SIGFPE獲得適當的核心文件(這是對陣列超載的懷疑來自何處)。

+0

你啓用了'apport'嗎? kernel.core_pattern的sysctl值有什麼價值? –

回答

1

讓我猜,這是x64的目標? Coredumps在那裏被禁用,以避免轉儲16TB影子內存(有關詳細信息,請參閱disable_coredumphere的文檔)。

GCC的新版本/鏘remove shadow from core by default這樣就可以做這樣的事情

export ASAN_OPTIONS=abort_on_error=1:disable_coredump=0 

但恐怕4.8太舊了這一點。

作爲一種替代建議,爲什麼回溯對您來說不夠?如果您無權訪問程序stderr,則可以使用log_pathlog_to_syslog來保留它們。

注:I posted suggestion在所有平臺上啓用核心。