【问题标题】:Print in program works but gdb says "Cannot access memory at address ..."程序中的打印有效,但 gdb 说“无法访问地址处的内存......”
【发布时间】:2015-04-16 22:01:14
【问题描述】:

我有以下代码:

struct A
{
  int fieldA;
  int fieldB;
};

A *a = (A *) ptr;

cout << a->fieldA; // Works fine
cout << a->fieldB; // Works fine

ptr 是一个 char * 对象,它指向内存中的某个位置。存储在内存中地址ptr 的对象是A 对象。该结构由另一个进程在进程之间共享的内存中写入。在我有上述代码的过程中,共享内存是只读的。

正在远程目标上执行的程序。我使用 gdb-server 在目标上运行程序,并使用 gdb 从我的开发机器连接到服务器。

打印语句正确打印预期值。但是,当我通过执行p a-&gt;fieldA 从 gdb 打印结构的字段时,我得到“无法访问地址...的内存”。这没有意义,因为我希望我的程序可以访问结构的内容,所以 gdb 也应该如此。

为什么会这样?

【问题讨论】:

  • “我希望既然我的程序可以访问结构的内容,那么 gdb 也应该如此” 这不一定成立。一方面,ptr 的值和a 的值会随着时间的推移而发生细微的变化。
  • 让我猜猜,ptr 不只是用mallocnew 分配的普通指针,而是例如由驱动程序函数分配的一些“设备内存”,或类似的东西?
  • @Mats 具体来说,ptr 指向的是另一个处理器正在写入的内存。我正在阅读ptr 内容的代码正在另一个处理器上运行。
  • @Lightning ptr 指向的地址没有改变。我观察到,如果我逐行执行打印语句,在cout 之前,gdb 给出错误,cout 之后 gdb 给出错误。然而,从程序中,打印出正确的值。
  • 对,所以内存不是“常规”内存,就像我说的那样。至少在 Linux 中,调试器不认为“设备内存”(由设备驱动程序分配的内存和类似的内存)是可读的[不要问我到底为什么,但我在 OpenCL 中调试时遇到过几次,其中内存是映射的 OpenCL 缓冲区,处理器代码可以完全访问,但调试器不能访问]

标签: c++ c gdb gdbserver


【解决方案1】:

我没有完全解释整个背景。我试图访问的内存区域是 mmap()'d 区域,gdb 无法查看这些区域。以下解决方案solution 解决了这个问题:编写一个从区域打印的函数,并从 gdb 调用该函数。

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多