读取gdb中定义好的值时出现分段错误

时间:2015-09-29 18:17:02

标签: c++ debugging segmentation-fault gdb

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

那么有什么理由可以说我的程序不允许读取某些数据,而gdb是允许的呢?

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

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

g ++(Debian 4.9.2-10)4.9.2 GNU 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;
};

1 个答案:

答案 0 :(得分:2)

最常见的原因(以及唯一的原因,我曾见过这种情况)为什么GDB可以读取字符串,但程序不能,就是数据驻留在没有页面的情况下PROT_READ

可以认为Linux内核中的一个错误是ptrace(PEEK_DATA, ...)(GDB用来读取下级(被调试的)程序数据的系统调用成功)当地址没有读取权限且程序本身可以不读那个地址。

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

另见this答案。