[英]How to get value at a memory address in linux shell
我知道我們可以通過C程序或gdb獲取內存地址的值。
有沒有辦法通過bash shell或類似“一行”perl指令獲取它?
簡短回答......不
如果你非常小心,可能會將指令傳遞給GDB並解釋輸出。 如果你想嘗試,請看看洛克斯的答案。
它是unix進程模型的一部分,一個進程無法在另一個進程內看到,無法讀取對方的內存。 這是為了安全。 有一個特殊的內核API可用於查看程序。 但是這個API的客戶很少。 GDB是我所知道的唯一一個。
我懷疑你想要實現的是一個非常糟糕的想法,或者可以在不讀取程序內存的情況下完成。
以下可能接近你可能想要的。 如果沒有,希望你能夠適應。
我會在一開始就說你對“記憶地址”的含義非常模糊。 下面我將把它理解為當前執行的指令的地址,我將使用gdb命令“backtrace”來獲取。 將gdb命令從“bt”調整為您想要獲取“內存地址”的任何內容。
假設您的程序是進程ID為3963的卧鋪
sudo gdb --ex 'bt 1' --batch -nx -p 3963
將運行附加到進程的gdb並給出最新條目的回溯。 這是一個例子:
sudo gdb --ex 'bt 1' --batch -nx -p 3963
84 ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) #0 0x00007f5dee71f2f0 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:84
如果你真的只想要帶有地址的行,那么你需要#0
,例如
sudo gdb --ex 'bt 1' --batch -nx -p 3963 | grep '#0'
(gdb) #0 0x00007f5dee71f2f0 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:84
如果你只是想要地址,你可能需要進一步削減,例如
$ sudo gdb --ex 'bt 1' -nx -p 3963| grep '#0' | cut -d' ' -f 4
0x00007f5dee71f2f0
如果您不知道進程ID,則可以使用pidof
。 例如,如果命令名是sleeper-for-pid
:
$ sudo gdb --ex 'bt 1' --batch -nx -p $(pidof sleeper-for-pid)
並且“sudo”可能適用於您,也可能不適合您。
就個人而言,我更喜歡不僅僅是最近的回溯條目。 所以bt 1
可能會被調整為bt 3
或bt
以獲得更完整的回溯。
希望這足以讓你開始。
我知道我們可以通過C程序或gdb獲取內存地址的值有沒有辦法通過bash shell或類似“one-line”perl指令獲取它?
shell只是一個程序。 你要求做的事情是毫無意義的。 假設shell確實允許您檢查內存地址(並且您可以輕松地修改shell或編寫自己的shell),內存地址的值是shell的進程。 任何其他進程將在同一地址具有不同的內存值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.