1. 生成帶調(diào)試信息的程序
- 直接用g++編譯:
$ g++ -g -ggdb -o test test.cpp
如果用CMake編譯工程绿满,則使用選項(xiàng)CMAKE_BUILD_TYPE=Debug:
$ cmake -DCMAKE_BUILD_TYPE=Debug ../test
這樣做g++編譯時(shí)就會(huì)包含選項(xiàng)-g。如果要同時(shí)包含-ggdb選項(xiàng)粤蝎,可以設(shè)置變量CMAKE_CXX_FLAGS_DEBUG真仲。
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
2. 設(shè)置Linux生成Core
2.1 設(shè)置core文件的大小
$ ulimit -c unlimited
2.2 設(shè)置core文件的名稱
$ echo 'core-%e-%p' | sudo tee /proc/sys/kernel/core_pattern
%e - insert coredumping executable name into filename 添加導(dǎo)致產(chǎn)生core的命令名
%p - insert pid into filename 添加pid(進(jìn)程id)
3. 生成core文件
運(yùn)行程序,生成core文件初澎。下面的命令強(qiáng)制生成core文件:
$ kill -s SIGSEGV <pid>
4. 調(diào)試Core
4.1 加載程序和core文件
$ gdb <exec> <core>
或者進(jìn)入gdb后
(gdb) file <exec>
(gdb) core <core>
file從文件exec加載symbol和executable, core從core中加載coredump
4.2 加載動(dòng)態(tài)庫的符號(hào)
如果是調(diào)試Core的機(jī)器(host)不是生成Core的機(jī)器(target)秸应,則動(dòng)態(tài)庫可能不在程序指定的位置上。這時(shí)需要指定動(dòng)態(tài)庫的位置谤狡。
4.2.1 用info sharedlibrary查看動(dòng)態(tài)庫
首先用info sharedlibrary,可以查看動(dòng)態(tài)庫的symbol是否加載正確
(gdb) info sharedlibrary
4.2.2 設(shè)置solib-absolute-prefix
如果庫在host上的布局與在target上的布局相同卧檐,則使用solib-absolute-prefix比較方便墓懂。
target上:
/opt/publish
host上:
/home/ronzheng/opt/publish
則可以設(shè)置solib-search-path為:
(gdb) set solib-absolute-prefix /home/ronzheng
solib-absolute-prefix有個(gè)更常用的別名sysroot,所以如下的命令是一樣的:
(gdb) set sysroot /home/ronzheng
4.2.3 設(shè)置solib-search-path
設(shè)置solib-search-path可以指定多個(gè)路徑霉囚,路徑之間用:隔開捕仔。
(gdb) set solib-search-path <path1:path2:path3>
5. 調(diào)試多線程
在多線程的環(huán)境下,可以用info threads顯示所有線程盈罐,thread指定線程為當(dāng)前線程榜跌。
(gdb) info threads
(gdb) thread <tid>
相關(guān)鏈接
GDB 常用法
GDB 調(diào)試Coredump問題
嵌入式開發(fā)中GDB調(diào)試Coredump問題
嵌入式開發(fā)中GDB串口遠(yuǎn)程調(diào)試
用backtrace()調(diào)試coredump問題
Valgrind memcheck 用法
Address Sanitizer 用法
參考資料
段錯(cuò)誤及GDB Coredump調(diào)試方法
https://blog.csdn.net/oscarjulia/article/details/74256997
gdb調(diào)試多進(jìn)程與多線程
https://blog.csdn.net/snow_5288/article/details/72982594