設定ulimit 除錯 segment fault

2022-03-04 04:37:43 字數 2250 閱讀 5815

今天除錯程式,總是遇到segment fault,由於的多執行緒程式,gdb除錯很麻煩,非常不爽,但是bug還總是在**需要解決啊。

只得想辦法。網上說可以生成core檔案,再用gdb除錯core,至少可以定位到**出錯。於是google。

segment fault產生的原因主要是與指標操作相關。

《gdb除錯core檔案樣例(如何定位segment fault)

》詳細介紹了相關錯誤原因

view code

一 造成segment fault,產生core dump的可能原因

1.記憶體訪問越界

a) 由於使用錯誤的下標,導致陣列訪問越界

b) 搜尋字串時,依靠字串結束符來判斷字串是否結束,但是字串沒有正常的使用結束符

c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字串操作函式,將目標字串讀/寫爆。

應該使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函式防止讀寫越界。

2 多執行緒程式使用了執行緒不安全的函式。

3 多執行緒讀寫的資料未加鎖保護。對於會被多個執行緒同時訪問的全域性資料,應該注意加鎖保護,否則很容易造成core dump

4 非法指標

a) 使用空指標

b) 隨意使用指標轉換。乙個指向一段記憶體的指標,除非確定這段記憶體原先就分配為某種結構或型別,或者這種結構或型別的陣列,

否則不要將它轉換為這種結構或型別的指標,而應該將這段記憶體拷貝到乙個這種結構或型別中,再訪問這個結構或型別。

這是因為如果這段記憶體的開始位址不是按照這種結構或型別對齊的,那麼訪問它時就很容易因為bus error而core dump.

5 堆疊溢位.不要使用大的區域性變數(因為區域性變數都分配在棧上),這樣容易造成堆疊溢位,破壞系統的棧和堆結構,導致出現莫名其妙的錯誤。

有了錯誤原因,接下去就是如何做了。

在各種linux/gnu的發行版本中,一般core生成是沒有開啟的,需要通過ulimit命令來開啟相關的選項。

ulimite -a 命令輸出如下

core file size (blocks, -c) 0data seg size           (kbytes, -d) unlimited

scheduling priority (-e) 0

file size (blocks, -f) unlimited

pending signals (-i) 4095

max locked memory (kbytes, -l) 32

max memory size (kbytes, -m) unlimited

open files (-n) 1024

pipe size (512 bytes, -p) 8

posix message queues (bytes, -q) 819200

real-time priority (-r) 0

stack size (kbytes, -s) 8192

cpu time (seconds, -t) unlimited

max user processes (-u) 4095

virtual memory (kbytes, -v) unlimited

file locks (-x) unlimited

可以看到 core block 為0

現在用 ulimite -c 1024 開啟core生成選項。(在debian下並不需要用sudo,sudo反而找不到命令)。

編譯程式的時候新增-g選項,生成除錯資訊。

生成a.out

執行 ./a.out 生成段錯誤檔案core.13764

再除錯即可。

gdb ./a.out core.13764

執行到錯誤處,在gdb中輸入

bt可以定位到**是哪一行出錯的。

接下來,就是逐步這樣迭代了。

ps:良好的**風格與程式設計技巧是減少無謂錯誤的良方,切記,切記。

linux設定ulimit值永久生效

小知識的積累,linux 預設開啟檔案數linux 預設開啟檔案數為1024個,通過ulimit a 可以檢視open files 修改這個限制可以使用ulimt shn 65536 永久生效需要進行下面設定 1.etc pam.d login 新增pam limits.so 有時候系統預設新增 首...

linux設定ulimit值永久生效

小知識的積累,linux 預設開啟檔案數linux 預設開啟檔案數為1024個,通過ulimit a 可以檢視open files 修改這個限制可以使用ulimt shn 65536 永久生效需要進行下面設定 1.etc pam.d login 新增pam limits.so 有時候系統預設新增 首...

Ubuntu18 04系統設定ulimit

sudo vim etc security limits.conf soft nproc 65535 hard nproc 65535 soft nofile 65535 hard nofile 65535 root soft nproc 65535 root hard nproc 65535 ro...