c++ dump某个变量_linux内核调试之 crash分析dump文件
Linux 下也有眾多的內存轉儲分析工具,lcrash、Alicia、Crash。Crash 是由 Dave Anderson 開發和維護的一個內存轉儲分析工具,目前它的最新版本是 5.0.0。 在沒有統一標準的內存轉儲文件的格式的情況下,Crash 工具支持眾多的內存轉儲文件格式:
- Live linux 系統
- kdump 產生的正常的和壓縮的內存轉儲文件
- 由 makedumpfile 命令生成的壓縮的內存轉儲文件
- 由 Netdump 生成的內存轉儲文件
- 由 Diskdump 生成的內存轉儲文件
- 由 Kdump 生成的 Xen 的內存轉儲文件
等等
【1】命令格式
crash [OPTION]... NAMELIST MEMORY-IMAGE[@ADDRESS]
1、namelist 是調試版本內核,即-g選項編譯的,可以自己用源碼加-g編譯,可以到發行版網站下載kernel-debuginfo軟件包,包含內核在/usr/lib/debug/lib/modules/內核版本/vmlinux;
2、memory-image 就是轉存的某格式dump文件
【2】安裝對應的kernel-debuginfo 和 軟件包debug-info-common
可在對應發行版網址上下載安裝包:這里以centos8為例:
http://debuginfo.centos.org/8/x86_64/Packages/
rpm -ivh kernel=debuginfo-common-xxx.rpm rpm -ivh kernel=debuginfo-xxx.rpm【3】執行
crash /usr/lib/debug/lib/modules/4.18.0-193.19.1.el8_2.x86_64/vmlinux /var/crash/127.0.0.1-2020-10-27-03:54:42/vmcorecrash 命令提示符
【4】crash常用內部命令
通過 crash 的內部命令,可以查看寄存器的值、函數的調用堆棧等信息。crash 使用 gdb 作為它的內部引擎,crash 中的很多命令和語法都與 gdb 相同。
1、 bt (
backtrace)打印內核堆棧,可以打印所以內核堆棧,也可以指定進程。
bt + pid 列出相應的進程堆棧
bt -f 會列出所有堆棧里面數據
bt -p 只打印panic的線程的內核棧,僅限于crash dump
2、dmesg(log)
查看崩潰時的log
3、dis
disassemble反匯編,參數可以使地址、符號(函數名、變量名),對其反匯編得到該地址對應的源碼
對應源碼:
第一行是ftrace的空指令;
第二、三、四、六行,是函數參數傳遞,rdi是第一個參數;
jmpq 是跳轉到下一個函數地址:do_sys_open
另外 -l參數可以顯示行號。
dis -l
dis -s [地址或符號] 顯示源文件名和源碼
dis -l write_sysrq_trigger+9 10 顯示符號地址+偏移,共顯示10行
4、rd
read memory. 讀相應的內存。
5、mod
module。查看顯示、加載模塊符號調試信息。crash使用的調試內核vmliux不包含ko,所以調試內核模塊需要加載-g編譯后的ko里的符號信息。
1)mod 不再參數會顯示當前系統安裝的模塊(以及加載符號)
2)mod -S 加載所有安裝模塊的符號調試信息
3)mod -s xxxmodule 加載指定安裝模塊的符號調試信息
4)mod -d xxxmodule
mod -s /tmp/xxx/xxxmodule 刪除并重新加載指令路徑的模塊的符號調試信息
6、x/FMT
examine memory。FMT包含size、格式和長度,比如 x/16x 就是打印出16個四字節長度地址的數(默認四字節),以十六進制格式顯示。
| x/nfu |
| n表示要顯示的內存單元的個數 |
| f表示顯示方式, 可取如下值 x 按十六進制格式顯示變量。 d 按十進制格式顯示變量。 u 按十進制格式顯示無符號整型。 o 按八進制格式顯示變量。 t 按二進制格式顯示變量。 a 按十六進制格式顯示變量。 i 指令地址格式 c 按字符格式顯示變量。 f 按浮點數格式顯示變量。 |
| u表示一個地址單元的長度 b表示單字節, h表示雙字節, w表示四字節, g表示八字節 |
和rd命令類似,只不過x是gdb的命令。
8、sym
虛擬地址和符號相互轉換
和dis -s [地址] 效果差不多
9、ps
打印內核崩潰時,正常的進程信息
可以加pid查看指定進程狀態
10、file
打印指定進程的文件打開列表(可配合ps使用)
類似的命令還有:
vm [pid] 進程虛擬地址空間
11、task [pid]
進程task_struct和thread_info的信息
12:kmen
可以查看當時的內存使用情況
kmem -I
【5】實際測試
(1)主動觸發的例子
1、觸發
echo c > /proc/sysrq-trigger2、crash分析dump文件
略
(2)空指針產生的core dump文件
1、crash打開core dump 文件
crash /usr/lib/debug/lib/modules/4.18.0-193.19.1.el8_2.x86_64/vmlinux vmcore2、bt -p 查看dump堆棧線程信息(或者dmesg或者log看內核dmesg信息)
3、分析
寄存器RIP是程序指令指針寄存器,可以看出在執行到proc_fork_connector 時觸發了頁異常。通過?;厮荽蛴?#xff0c;上一個函數是copy_process.
4、dis -s 分析源碼里這個函數哪里來的
dis -s 0xffffffff846aff85
可見在copy_process 函數中,調用proc_fork_connector 崩潰,進而分析可能是參數p 有問題
實驗環境:
內核版本:kernel 4.18.0-193.19.1.el8_2.x86_64
crash版本:crash version: 7.2.7-3.el8
kexec-tool:kexec-tools 2.0.20
【6】參考:
https://www.ibm.com/developerworks/cn/linux/l-cn-kdump3/index.html?mhsrc=ibmsearch_a&mhq=%E4%BD%BF%E7%94%A8%20Crash%20%E5%B7%A5%E5%85%B7%E5%88%86%E6%9E%90%20Linux%20dump%20%E6%96%87%E4%BB%B6?www.ibm.com總結
以上是生活随笔為你收集整理的c++ dump某个变量_linux内核调试之 crash分析dump文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 公众号滑动图代码_脱离模板!教你自己动手
- 下一篇: pps服务器未响应_服务响应时间与分布