日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

c++ dump某个变量_linux内核调试之 crash分析dump文件

發布時間:2025/3/21 linux 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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/vmcore

crash 命令提示符

【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-trigger

2、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 vmcore

2、bt -p 查看dump堆棧線程信息(或者dmesg或者log看內核dmesg信息)

3、分析

寄存器RIP是程序指令指針寄存器,可以看出在執行到proc_fork_connector 時觸發了頁異常。通過棧回溯打印,上一個函數是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文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。