当前位置: 首页 > 面试题库 >

读取活动过程内存而不会中断它

宗政学
2023-03-14
问题内容

我想探索一个正在运行的进程的内存,当我这样做时,该进程一定不能被打扰-因此,将gdb附加到该进程(这将停止它)是不可行的。因此,我想从/ proc /
kcore获取此信息(如果您知道执行此操作的另一种方法,请告诉我)。所以我做了一个小实验。我创建了一个名为TEST的文件,其中仅包含“
EXTRATESTEXTRA”。然后我用更少的时间打开它

$ less TEST

我得到了这个过程的PID

$ ps aux | grep TEST
user    7785  0.0  0.0  17944   992 pts/8    S+   16:15   0:00 less TEST
user    7798  0.0  0.0  13584   904 pts/9    S+   16:16   0:00 grep TEST

然后,我使用此脚本创建了所有文件的转储:

#!/bin/bash
grep rw-p /proc/$1/maps | sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' | while read start stop; do gdb --batch --pid $1 -ex "dump memory $1-$start-$stop.dump 0x$start 0x$stop"; done

(我在这个网站上找到它https://serverfault.com/questions/173999/dump-a-linux-processs-
memory-to-file)

$ sudo ./dump_all_pid_memory.sh 7785

之后,我在所有转储文件中寻找“ TRATESTEX”:

$ grep -a -o -e '...TRATESTEX...' ./*.dump
./7785-00624000-00628000.dump:HEXTRATESTEXTRA
./7785-00b8f000-00bb0000.dump:EXTRATESTEXTRA
./7785-00b8f000-00bb0000.dump:EXTRATESTEXTRA

因此,我得出结论,该字符串必须在0x00624000和0x00628000之间出现。因此,我将偏移量转换为十进制数,并使用dd从/ proc /
kcore获取内存:

$ sudo dd if="/proc/kcore" of="./y.txt" skip="0" count="1638400" bs=1

令我惊讶的是,文件y.txt充满了零(我没有在其中找到要查找的字符串)。

令我惊讶的是,我同时使用不同的测试文件运行了类似的测试,发现我正在使用的其他测试字符串(两个同时运行较少的进程)应该在同一位置找到(转储和greping给出了相同的偏移量)。所以肯定有些我不明白的东西。

  • / proc / pid / maps是否应该显示内存的偏移量(即:如果说“ XXX”位于偏移量0x10处,则另一个程序不能使用相同的偏移量,对吗?-这是我第二个惊喜的来源)

  • 我如何读取/ proc / kmap以获得属于我知道的pid进程的内存?


问题答案:

对于进程1234,您可以通过顺序读取/proc/1234/maps(文本伪文件)来获取其内存映射,并通过对稀疏伪文件的适当段进行read(2)
-ing或mmap(2) -ing来读取虚拟内存/proc/1234/mem

但是,我相信您无法避免某种同步(也许与ptrace(2)一样gdb),因为进程1234可以(并且确实)随时更改其地址空间(使用mmap&相关的系统调用)。

如果受监视的进程1234不是任意的,则情况有所不同,但是如果可以改进它以某种方式与监视进程进行通信,则情况会有所不同。

我不确定您为什么要问这个。并且gdb能够在watch不停止进程的情况下到达某个位置。



 类似资料:
  • 我正在寻找一种方法来读取PHP会话的内容,而无需实际替换当前请求的运行会话。 假设我有一个正在运行的会话(之前使用session_start()启动,使用默认会话处理程序和PHPSESSID cookie提供的session_id),现在我有了另一个(有效的)session_id,我想读取该会话中存储的一些数据。 我能想到的唯一方法是用$old会话=session_id()替换当前会话,用sess

  • 问题内容: 当我写这篇文章时,我尝试使用Pandas处理大型CSV文件。 它会引发“ pandas.parser.CParserError:错误标记数据。C错误:内存不足” wc -l表示有13822117行,我需要在此csv文件数据帧上进行汇总,有没有办法处理其他然后拆分CSV成几个文件,并编写代码以合并结果?有什么建议吗?谢谢 输入是这样的: 所需的输出是这样的: 如果数据集较小,则可以使用下

  • 问题内容: 如何在不冻结程序的情况下用Java执行进程?我已经尝试过使用SwingWorker,但是我还不太了解它是如何工作的。 我还有其他方法可以做到这一点吗?我想在我的JDroidLib中使用类似的东西。有关完整的源代码,请查看GitHub:http : //github.com/Team-M4gkBeatz/JDroidLib 提前致谢! 编辑: 感谢您的回答。但是我有一个带有几种方法的类(

  • 我在这里找到了一些关于使用Android阅读NFC标签的最近帖子。我得到的结论是,执行NFC读取动作会触发一个分离的意图。 那么第一个问题:在我的清单中列出意图过滤器是否必要? 我认为这是没有必要的,因为我不想推出我的应用程序通过NFC标签事件,对吗? 第二个问题:我如何保持我的NFC阅读逻辑/功能与我的app/活动相关? 例如,在iOS中,在VC中需要时有一个简单的NFC会话。

  • 我有一个过滤器视图,在关闭后,我想做两件可访问性的事情: 宣布“$listSize列表中的项目”,因为应用过滤器将更改列表大小 将焦点设置为“添加过滤器”按钮 我尝试了以下方法: 我希望TalkBack按顺序阅读: “列表中的 20 个项目” “过滤器按钮” 但是,它通常会跳过第一次读出,只读取上的文本。有时它会在跳到第二个之前只读取第一个的一部分。 如何强制TalkBack读出两个辅助功能事件?

  • 我正在尝试在启动照相机活动之前从用户处获得照相机权限。onRequestPermissionsResult在用户从权限对话框中按“允许”后不会被回调。这是我的活动课: 以下是具有摄像头权限的我的应用程序清单: 我的Gradle依赖: