c++ - GDB 无法访问 mmap() 的内核分配内存?

标签 c++ c gdb mmap

我遇到了 GDB 问题和在内核空间中分配的一些缓冲区。缓冲区由一个内核模块分配,该模块应该分配连续的内存块,然后通过 mmap() 调用将内存映射到用户空间。然而,GDB 似乎无法随时访问这些 block 。例如,在 GDB 中遇到断点后:

(gdb) x /10xb 0x4567e000
0x4567e000:     Cannot access memory at address 0x4567e000

但是,查看/proc//smaps 中应用程序当前映射的内存区域显示:

4567e000-456d3000 rwxs 8913f000 00:0d 883        /dev/cmem
Size:                340 kB
Rss:                 340 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Swap:                  0 kB

我什至正在研究这个的原因是因为在运行期间的某个时刻,这个缓冲区地址(或以类似方式分配的另一个地址)导致 SIGSEGV。

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x49aea490 (LWP 652)]
0x402e4ea8 in fwrite () from /lib/libc.so.6
(gdb)
(gdb)
(gdb) where
#0  0x402e4ea8 in fwrite () from /lib/libc.so.6
#1  0x000eb394 in EncryptedWriter::Write (this=0x198600, buffRaw=0x4567e000 <Address     0x4567e000 out of bounds>, iLenRaw=719) at encrypted_writer.cpp:397
#2  0x0006b0f4 in EncryptionWrapper::Write (this=0x3ab2698, buffer=0x4567e000, size=719) at encryption.cpp:54

尽管缓冲区在崩溃之前已被大量使用,但/proc//smaps 文件仍显示此缓冲区已按上述方式映射,但仍会发生此段错误。

我完全不知道为什么会发生这种情况,以及为什么映射在/proc 中似乎有效但在 GDB 中却从来没有。

最佳答案

关于为什么gdb不能访问你想要的内存,我相信Linux不会通过ptrace()访问I/O内存。 .

根据 cmemk.c(我在 linuxutils_2_25.tar.gz 中找到),mmap() 确实在相关内存上设置了 VM_IO 标志。

要从 gdb 访问此内存,请向您的程序添加一个函数来读取此内存并让 gdb 调用此函数。

关于c++ - GDB 无法访问 mmap() 的内核分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3640095/

相关文章:

c++ - 在 Android NDK 项目中使用内联 ARM asm

C++ MFC 创建新对话框并添加 Combobox 项

c# - 如何通过更改文本创建一个像这样的dll?

objective-c - GDB 不支持@dynamic 属性?

c++ - 如何从文件中读入点

java - 在关闭远程桌面连接时运行 s/w

c - cuda共享内存静态分配错误

c - memset 没有设置 num 个字节?

c - 使用 MinGW 的 C 中的段错误

c++ - std::initializer_list 的内存损坏