函数地址不在 lisp 图像处理的内存映射文件范围内

Function address not in the range of memory-mapped files for the lisp image process

定义和反汇编函数fn后,我可以看到函数(或代码组件)位于内存地址0x53675216。但是我没有看到所述内存地址在归因于 lisp 图像进程的内存映射文件范围内(我正在使用 SBCL)。

我是否遗漏了有关流程内部运作方式的信息?


FWIW 我的目标是转储进程的整个内存并检查一些内存。但是,如果我什至无法访问我定义的函数,那又有什么意义呢?

请post实际文字而不是文字图片。

/proc/<pid>/map_files 不是正确的选择:而是查看 /proc/<pid>/maps,它显示了所有内存映射。

在我的例子中,如果我在 x64 / Linux 上的 SBCL 上定义并编译 foo 为:

(defun foo ())

然后 (disassemble 'foo) 看起来像:

; disassembly for foo
; Size: 21 bytes. Origin: #x53624A7C                          ; foo
[...]

我可以使用 中的 hexdump-thing 函数来检查:

> (hexdump-thing #'foo)
> (hexdump-thing #'foo)
lowtags:    1011
function:   0000000053624A6B : 0000000053624A60

所以对象的实际地址是#x0000000053624A60,这与disassemble所说的相符。

那么如果我查看 /proc/<pid>/maps 我会看到,在所有其他行中,有两行如下:

52a00000-533f8000 rwxp 016a8000 fd:00 2758077                            /local/environments/sbcl/lib/sbcl/sbcl.core
533f8000-5ac00000 rwxp 00000000 00:00 0

这个文件中的字段是地址,权限,偏移量,设备,inode,文件。您可以看到包含函数地址的范围未映射到任何文件(请注意,p 表示 'copy on write',因此映射到核心文件的范围永远不会写回核心文件)。

函数的定义位于这个匿名内存范围内的某个地方。


注意:如果您想调查实现的内存,在实现内部进行,这比尝试从外部进行调查要容易得多。 SBCL 对这类事情有很多支持,尽管您必须通过在源代码中四处寻找才能找到其中的一些。毕竟这种事情正是垃圾收集器必须做的。