Linux中使用gdb dump內存


在應急響應中,我們往往會有dump出某一塊內存下來進行分析的必要。今天要講的是利用gdb命令dump出sshd進程的內存。

按照 Linux 系統的設計哲學,內核只提供dump內存的機制,用戶想要dump什么樣的內存,dump多少內存是屬於策略問題,由用戶來決定。

在真實的使用場景中,主要有兩種使用方式:

  • 一種是dump某一個進程的地址空間來供用戶在進程掛掉之后debug分析,也就是通常所說的coredump
  • 另一種就是dump整個系統的內存空間,以便於系統管理員debug分析系統掛掉的原因,也就是通常所說的 kdump,由於dump內存的邏輯依然需要系統可以正常工作,管理系統的各種資源,所以kdump整個過程依賴kexec和一個額外的dump內核來保證整個流程正確的執行。

以下演示的是dump出某一個進程(sshd)的內存。

ps aux | grep sshd    #過濾出sshd進程,記錄其PID
cat /proc/1431/maps   #查看1431進程的內存地址

啟動gdb,將sshd進程attach到gdb上

gdb attach 1431

dump指定內存地址到指定的目錄下

dump memory /tmp/sshd.dump 0x7f25c2a4e000 0x7f25c2a59000  #這里只dump sshd進程的第一塊內存
  
dump memory /tmp/sshd.dump 0x7f25c2a4e000 0x7f25c2e61000  #dump了指定的內存塊
# "dump memory"是命令 
# "/tmp/sshd.dump"是我們想保存dump出的內容的路徑。 
# 兩個hex是內存地址區間,這跟/proc/1431/maps的格式有些不一樣。這是以0x開頭的16進制表示的。

之后,去/tmp目錄下,可以看到dump出的sshd.dmp內存

strings -10 sshd.dump   #查看sshd.dump內存中至少大於10字符的字符


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM