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

C++ 读取gdb中定义良好的值时出现分段错误,c++,debugging,segmentation-fault,gdb,C++,Debugging,Segmentation Fault,Gdb,我现在有个大问题。我的代码中有一个分段错误,我用调试器处理了它。我正在从一个对象读取成员const char*name,以便使用printf打印它。这就是我的错误所在。我猜指向该对象的指针是无效的,但是从gdb我可以检查该对象的所有值,并且name的内容正是它应该的内容。我完全不知道为什么我会出现分割错误 那么有什么原因,我的程序不允许读取某些数据,而gdb允许这样做? 编辑:对于那些仍然没有得到它的人,我不是要求任何人来解决我的问题,我只是想知道如何以及在哪些情况下允许调试器读取一些数据,而我

我现在有个大问题。我的代码中有一个分段错误,我用调试器处理了它。我正在从一个对象读取成员
const char*name
,以便使用
printf
打印它。这就是我的错误所在。我猜指向该对象的指针是无效的,但是从gdb我可以检查该对象的所有值,并且
name
的内容正是它应该的内容。我完全不知道为什么我会出现分割错误

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

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

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

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

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

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

当地址没有读取权限且程序本身无法读取该地址时,
ptrace(PEEK_DATA,…)
(GDB用来读取低级(正在调试的)程序数据的系统调用)成功,这可以被认为是Linux内核中的一个bug

您可以在GDB中使用
info proc maps
,找到对应于(cover)
plugin->picking\u handler->name
原始地址的内存区域,并查看其权限


另请参见答案。

请显示为
name
赋值的代码以及如何使用它。请显示printf中字符串的初始化和用法。这些屏幕截图没有用处-只是懒散而已。您有name().toUtf,但没有普通名称的printf。名称是函数还是纯数据?@josilber你能写下我需要重新打开的问题吗?
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;
};