函数地址不在 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 对这类事情有很多支持,尽管您必须通过在源代码中四处寻找才能找到其中的一些。毕竟这种事情正是垃圾收集器必须做的。
定义和反汇编函数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 对这类事情有很多支持,尽管您必须通过在源代码中四处寻找才能找到其中的一些。毕竟这种事情正是垃圾收集器必须做的。