gpt4 book ai didi

c++ - 读取在 gdb 中明确定义的值时出现段错误

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:19 25 4
gpt4 key购买 nike

我现在有一个大问题。我在我的代码中遇到了一个段错误,我用调试器逐步解决了它。我正在从一个对象中读取成员 const char* name , 用 printf 打印它.这就是我的段错误的来源。我猜测指向对象的指针是无效的,但是从 gdb 我可以检查该对象的所有值,以及 name 的内容。正是它应该是什么。我完全不知道为什么会出现段错误。

那么是什么原因导致我的程序不允许读取某些数据,而 gdb 允许这样做呢?

编辑:对于那些仍然没有得到它的人,我不是要求任何人解决我的问题,我只是想知道如何以及在哪些情况下允许调试器读取一些数据,以及我的程序不是。我添加了一个屏幕截图作为证明我没有在这里编造东西,但我不需要你理解我的代码。

只是一些角落信息。我的程序是 Qt 应用程序的插件。它使用 Qt 插件 api 通过 lib<PluginName>.so 加载插件.

g++ (Debian 4.9.2-10) 4.9.2GNU gdb (Debian 7.7.1+dfsg-5) 7.7.1

编辑:我添加了一个屏幕截图以更好地查看问题。初始化由构造函数完成。

proof .

class PickingHandler {
public:
const char* name;
PickingHandler(const char* name) : name(name) {}
[...]
virtual void Drag(PickResult) = 0;
};

class ConnectHandler : public PickingHandler {
public:
ConnectHandler() : PickingHandler("connect handler") {}
[...]
void Drag(PickResult) override;
};

最佳答案

GDB 可以读取字符串但程序不能读取的最常见原因(也是我见过这种情况的唯一原因)是当数据驻留在页面上时没有PROT_READ

ptrace(PEEK_DATA, ...)(GDB 用来读取次级(正在调试的)程序数据的系统调用)可以被认为是 Linux 内核中的一个错误,本地址没有读取权限,程序本身无法读取该地址。

可以在GDB中使用info proc maps,找到(覆盖)plugin->picking_handler->name原始地址对应的内存区域,看看它是什么权限是。

另见 this回答。

关于c++ - 读取在 gdb 中明确定义的值时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32851068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com