簡體   English   中英

如何在linux shell中獲取內存地址的值

[英]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 3bt以獲得更完整的回溯。

希望這足以讓你開始。

我知道我們可以通過C程序或gdb獲取內存地址的值有沒有辦法通過bash shell或類似“one-line”perl指令獲取它?

shell只是一個程序。 你要求做的事情是毫無意義的。 假設shell確實允許您檢查內存地址(並且您可以輕松地修改shell或編寫自己的shell),內存地址的值是shell的進程。 任何其他進程將在同一地址具有不同的內存值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM