2015-02-17 32 views
2

我想轉儲流程的內存頁面,一旦它完成執行。我想使用gdb,首先我在exit和_exit處設置斷點,然後在gdb中運行進程,一旦進程中斷,我使用info proc mappings來獲取進程的內存映射。它看起來像如下:如何轉儲進程的內存頁面?

Mapped address spaces: 

      Start Addr   End Addr  Size  Offset objfile 
      0x400000   0x415000 0x15000  0x0 /path/workspace/freqmine 
      0x614000   0x615000  0x1000 0x14000 /path/workspace/freqmine 
      0x615000   0x616000  0x1000 0x15000 /path/workspace/freqmine 
      0x616000   0x129b000 0xc85000  0x0 [heap] 
     0x7ffff71f4000  0x7ffff720a000 0x16000  0x0 /lib/x86_64-linux-gnu/libgcc_s.so.1 
     0x7ffff720a000  0x7ffff7409000 0x1ff000 0x16000 /lib/x86_64-linux-gnu/libgcc_s.so.1 
     0x7ffff7409000  0x7ffff740a000  0x1000 0x15000 /lib/x86_64-linux-gnu/libgcc_s.so.1 
     0x7ffff740a000  0x7ffff750f000 0x105000  0x0 /lib/x86_64-linux-gnu/libm-2.19.so 
     0x7ffff750f000  0x7ffff770e000 0x1ff000 0x105000 /lib/x86_64-linux-gnu/libm-2.19.so 
     0x7ffff770e000  0x7ffff770f000  0x1000 0x104000 /lib/x86_64-linux-gnu/libm-2.19.so 
     0x7ffff770f000  0x7ffff7710000  0x1000 0x105000 /lib/x86_64-linux-gnu/libm-2.19.so 
     0x7ffff7710000  0x7ffff78cb000 0x1bb000  0x0 /lib/x86_64-linux-gnu/libc-2.19.so 
     0x7ffff78cb000  0x7ffff7acb000 0x200000 0x1bb000 /lib/x86_64-linux-gnu/libc-2.19.so 
     0x7ffff7acb000  0x7ffff7acf000  0x4000 0x1bb000 /lib/x86_64-linux-gnu/libc-2.19.so 
     0x7ffff7acf000  0x7ffff7ad1000  0x2000 0x1bf000 /lib/x86_64-linux-gnu/libc-2.19.so 
     0x7ffff7ad1000  0x7ffff7ad6000  0x5000  0x0 
     0x7ffff7ad6000  0x7ffff7bbc000 0xe6000  0x0 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19 
     0x7ffff7bbc000  0x7ffff7dbb000 0x1ff000 0xe6000 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19 
     0x7ffff7dbb000  0x7ffff7dc3000  0x8000 0xe5000 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19 
     0x7ffff7dc3000  0x7ffff7dc5000  0x2000 0xed000 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19 
     0x7ffff7dc5000  0x7ffff7dda000 0x15000  0x0 
     0x7ffff7dda000  0x7ffff7dfd000 0x23000  0x0 /lib/x86_64-linux-gnu/ld-2.19.so 
     0x7ffff7fce000  0x7ffff7fd3000  0x5000  0x0 
     0x7ffff7ff7000  0x7ffff7ffa000  0x3000  0x0 
     0x7ffff7ffa000  0x7ffff7ffc000  0x2000  0x0 [vdso] 
     0x7ffff7ffc000  0x7ffff7ffd000  0x1000 0x22000 /lib/x86_64-linux-gnu/ld-2.19.so 
     0x7ffff7ffd000  0x7ffff7ffe000  0x1000 0x23000 /lib/x86_64-linux-gnu/ld-2.19.so 
     0x7ffff7ffe000  0x7ffff7fff000  0x1000  0x0 
     0x7ffffffdd000  0x7ffffffff000 0x22000  0x0 [stack] 
    0xffffffffff600000 0xffffffffff601000  0x1000  0x0 [vsyscall] 

現在我有兩個問題,第一:getconf PAGESIZE在我的機器返回4096等於0x1000,一些內存空間的大小不同,但。這怎麼可能?這些空間是內存頁還是邏輯空間?如果這些不是內存頁面,如何查看內存頁面的地址,甚至直接將內存頁面轉儲到文件?

我的第二個問題是:這些地址應該是由程序查看的虛擬地址(不是物理地址),爲什麼程序空間不是從0開始的?如果我嘗試從地址0開始轉儲內存,則會出現以下錯誤:Cannot access memory at address 0x0。還有爲什麼這些內存空間之間存在一些無法訪問的區域(例如堆之後的區域)?過程的虛擬空間不應該是連續的嗎?

回答

2

some of these memory spaces have different sizes though. how is that possible?

很簡單:它們跨越多個頁面(請注意,所有的尺寸都是倍數爲0x1000)。

are these spaces memory pages or just logical spaces?

它們是一個或多個具有相同底層映射(相同文件)和相同保護的頁面的跨度。我不確定你稱之爲「邏輯空間」究竟是什麼,但你可以稱它們爲「機器」。

these addresses are supposed to be virtual addresses viewed by the program (not physical addresses),

正確。

so why doesn't the program space start at 0?

因爲很久以前用來映射地址0的東西VAX機,這讓很難找到空指針引用(他們沒有崩潰)。這被認爲是壞主意,所以後來的UNIX變體做不是映射零頁,並且任何嘗試取消引用NULL指針都會導致SIGSEGV,幫助您調試程序。