我知道我们可以通过C程序或gdb获取内存地址的值。
有没有办法通过bash shell或类似“one-line”perl指令获取它?
答案 0 :(得分:2)
简短回答......没有
如果你非常小心,可能会将指令传递给GDB并解释输出。如果你想尝试,请看看洛克斯的答案。
它是unix进程模型的一部分,一个进程在另一个进程内部看不到,无法读取对方的内存。这是为了安全。有一个特殊的内核API可用于查看程序。但是这个API的客户很少。 GDB是我所知道的唯一一个。
我怀疑你想要实现的目标要么是一个非常糟糕的主意,要么可以在没有阅读程序记忆的情况下完成。
答案 1 :(得分:1)
以下内容可能接近您的需求。如果没有,希望你能够适应。
我会在一开始就说你对“记忆地址”的含义非常模糊。下面我将把它理解为当前执行的指令的地址,我将使用gdb命令“backtrace”来获取。将gdb命令从“bt”调整为您想要获取“内存地址”的任何内容。
假设您的程序是进程ID为3963
的卧铺> 2017-12-11T18:13:34.4411552Z ##[debug]Processed: ##vso[task.logdetail
> id=b053619e-0646-45e5-8778-efc3bdd6c71a;parentid=567e2a52-8416-481f-9c9c-4bf1c4c56077;name=MYBLLProject.csproj;type=Build;starttime=2017-12-11T18:13:34.4384956Z;state=InProgress;]
> 2017-12-11T18:13:34.4527426Z
> ##[error]MYBLLFolder\MYBLLProject.csproj(79,5): Error : This project references NuGet package(s) that are missing on this
> computer. Enable NuGet Package Restore to download them. For more
> information, see http://go.microsoft.com/fwlink/?LinkID=322105. The
> missing file is
> C:\a\w\11\s\MyProject\\.nuget\NuGet.targets.
> 2017-12-11T18:13:34.4528532Z ##[debug]Processed: ##vso[task.logissue
> type=Error;sourcepath=C:\a\w\11\s\MYBLLProject\MYBLLProject.csproj;linenumber=79;columnnumber=5;code=;]This
> project references NuGet package(s) that are missing on this computer.
> Enable NuGet Package Restore to download them.
将运行附加到进程的gdb并给出最近一个条目的回溯。这是一个例子:
sudo gdb --ex 'bt 1' --batch -nx -p 3963
如果你真的只想要带有地址的那一行,那你就要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
如果您不知道进程ID,则可以使用$ sudo gdb --ex 'bt 1' -nx -p 3963| grep '#0' | cut -d' ' -f 4
0x00007f5dee71f2f0
。例如,如果命令名称为pidof
:
sleeper-for-pid
“sudo”可能适用于您,也可能不适合您。
就个人而言,我不仅仅是最近的回溯条目,而是更喜欢。因此$ sudo gdb --ex 'bt 1' --batch -nx -p $(pidof sleeper-for-pid)
可能会调整为bt 1
或bt 3
以获得更完整的回溯。
希望这足以让你开始。
答案 2 :(得分:0)
我知道我们可以通过C程序或gdb获取内存地址的值有没有办法通过bash shell或类似“one-line”perl指令获取它?
shell只是一个程序。你要求做的事情是毫无意义的。假设shell确实允许您检查内存地址(并且您可以轻松地修改shell或编写自己的shell),内存地址的值是shell的进程。任何其他进程在同一地址都会有不同的内存值。