Linux中快速定位段錯誤的方法

2021-08-17 19:43:37 字數 4187 閱讀 7606

在做嵌入式linux開發的時候,程式很容易出現段錯誤。段錯誤一般是記憶體操作指標出錯或是記憶體溢位等問題,有的時候系統會有一點錯誤提示,但有的時候就直接提示個segmentation fault (core dumped) 。如果程式是單執行緒,那很好處理,編譯的時候新增引數-g  ,直接使用gdb 單步除錯就可以直接定位到問題點在哪了。但是對於多執行緒,情況就不一樣了。多執行緒進行單步除錯不好處理,並且時候程式需要執行很久才出來段錯誤。這樣直接使用gdb單步除錯就不合適了。這裡提供一種快速定位段錯誤的方式。

1.ulimit 命令設定core檔案的最大值

1.1執行ulimit -a, 檢視core檔案的最大值,一般預設值是0

biao@ubuntu:~/test/fwh/9th_disktest$ ulimit -a

core file size          (blocks, -c) 0

data seg size           (kbytes, -d) unlimited

scheduling priority             (-e) 0

file size               (blocks, -f) unlimited

pending signals                 (-i) 3712

max locked memory       (kbytes, -l) 64

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) 3712

virtual memory          (kbytes, -v) unlimited

file locks                      (-x) unlimited

1.2執行命令:ulimit -c unlimited

biao@ubuntu:~/test/fwh/9th_disktest$ulimit -c unlimited

biao@ubuntu:~/test/fwh/9th_disktest$ ulimit -a 

core file size          (blocks, -c) unlimited

data seg size           (kbytes, -d) unlimited

scheduling priority             (-e) 0

file size               (blocks, -f) unlimited

pending signals                 (-i) 3712

max locked memory       (kbytes, -l) 64

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) 3712

virtual memory          (kbytes, -v) unlimited

file locks                      (-x) unlimited

biao@ubuntu:~/test/fwh/9th_disktest$ 

可以看到core file size  已經被修改為不受限制,執行程式的時候會在當前目錄生成乙個core檔案

biao@ubuntu:~/test/fwh/9th_disktest$ ls

core  diskmanage  encodereadwrite  indexmanage  main.cpp  main.o  makefile  sharestruct.h  test

2.使用gdb除錯:

biao@ubuntu:~/test/fwh/9th_disktest$ sudo gdb test core 

this is free software: you are free to change and redistribute it.

there is no warranty, to the extent permitted by law.  type "show copying"

and "show warranty" for details.

this gdb was configured as "x86_64-linux-gnu".

type "show configuration" for configuration details.

for bug reporting instructions, please see:

.find the gdb manual and other documentation resources online at:

.for help, type "help".

type "apropos word" to search for commands related to "word"...

reading symbols from test...done.

[new lwp 7445]

[new lwp 7440]

[new lwp 7441]

[new lwp 7443]

[new lwp 7444]

[new lwp 7442]

[thread debugging using libthread_db enabled]

using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

core was generated by `./test'.

program terminated with signal sigsegv, segmentation fault.

#0  0x00000000004046c0 in storageservice::videowritethread (this=0x71e470, arg=0x7fffac5cbccc)

at encodereadwrite/storageservice.cpp:627

627                             l_s32ret = l_paudioque[i]->readqueue(i,(void*)l_paudiodataout[i]);

[current thread is 1 (thread 0x7f32e0fa5700 (lwp 7445))]

(gdb) printf i

bad format string, missing '"'.

(gdb) print i 

$1 = 6

(gdb) q

biao@ubuntu:~/test/fwh/9th_disktest$ 

上面的test 為我的可執行程式。

這樣可以精確的定位到出現段錯誤的函式行,並可以檢視各引數的值,這樣定位起來就很快了。注意:

在乙個shell 執行緒中,core file size 值只能被修改一次,如果取消之後再修改會出現錯誤:

-bash: ulimit: core file size: cannot modify limit: operation not permitted

解決這一問題的方法是exit退出該shell,重啟乙個shell 就可以了。

多執行緒中快速定位段錯誤位置

在做嵌入式linux開發的時候,程式很容易出現段錯誤。段錯誤一般是記憶體操作指標出錯或是記憶體溢位等問題,有的時候系統會有一點錯誤提示,但有的時候就直接提示個segmentation fault core dumped 如果程式是單執行緒,那很好處理,編譯的時候新增引數 g 直接使用gdb 單步除錯...

通過GDB快速定位「段錯誤」的位置

有些時候我們在一段 c c 的時候,由於對乙個非法記憶體進行了操作,在程式執行的過程中,出現了 segmentation fault core dumped 段錯誤。呵呵,這種問題我想很多人會經常遇到。遇到這種問題是非常無語的,只是提示了 段錯誤 接著什麼都沒有,如果我們一味的去看 找太疼苦了,因為...

匯流排錯誤和段錯誤問題的定位

對現在的很多初級的程式原來說如果遇到 匯流排錯誤 bus error 或者段錯誤 segementation fault core dump 是一件非常折磨人的事,讓人一時間找不到什麼好的方法也不知從何處下手去解決這個問題 和許多人一樣,我很快也遇到了這樣的問題 出現這個錯誤時,錯誤資訊對引起這種事...