4

我在遇到分段错误的代码中执行简单的字符串操作。我不知道确切的问题是什么。请看看是否有人可以提供帮助。

核心的回溯是

(gdb) bt
#0  0x00007f595dee41da in _dl_fixup () from /lib64/ld-linux-x86-64.so.2
#1  0x00007f595deea105 in _dl_runtime_resolve () from /lib64/ld-linux-x86-64.so.2
#2  0x0000000000401d04 in getNodeInfo (node=0x7fffbfb4ba83 "TCU-0")
    at hwdetails.cpp:294
#3  0x0000000000402178 in main (argc=3, argv=0x7fffbfb4aef8)
    at hwdetails.cpp:369

第 294 行,崩溃发生在cout声明所在的位置。
LdapDNchar *和不是NULL

if ( Epath && (Epath->Entry[0].EntityType == SAHPI_ENT_UNSPECIFIED ||
         Epath->Entry[0].EntityType == SAHPI_ENT_ROOT )) {
        // nothing is mapped. Degrade the ldap dn path to slot.
        if(LdapDN){
            std::cout << "LdapDN " << LdapDN << std::endl;
        }
        std::string ldapDN;
        ldapDN = LdapDN;
        std::string slot = LDAP_PIU_ID;
        if ( ldapDN.compare(0, slot.length(), slot) != 0 ) {
            size_t pos = ldapDN.find(slot);
            if ( pos != std::string::npos ) {
                ldapDN = ldapDN.substr(pos);
                LdapDN = (char *)ldapDN.c_str();
                //getEntityPathFromLdapDn(ldapDN.c_str(), epath, domid);
            }
        }
     }
4

3 回答 3

8

崩溃_dl_fixup通常意味着您损坏了运行时加载程序的状态。

两个最常见的原因是:

  1. 堆损坏(溢出)或
  2. 自身不匹配的部分glibc

如果您没有设置例如LD_LIBRARY_PATH指向非标准glibc,那么我们可以忘记原因#2。

对于#1,在 Valgrind 下运行你的程序,并确保它没有检测到错误。

如果实际上没有,请使用GDB 命令disasinfo registers用它们的输出更新您的问题,您可能会收到额外的帮助。

于 2012-05-19T21:11:10.210 回答
2

这是 GOT 表的问题。_dl_runtime_resolve - 当动态库中的某些函数第一次调用时,更改 GOT(全局偏移表)的过程。在下次使用更改的 GOT 条目时。当您的代码中第一次调用来自动态库的函数(例如来自 libc.so 的 printf())时:

  1. 转到 PLT(程序查找表)。PLT 是一个蹦床,它可以获取从 GOT 调用的函数的正确地址。
  2. 从 PLT 转到 GOT
  3. 返回PLT
  4. 调用 _dl_runtime_resolve
    • 将实际函数跳转地址存储到 GOT
    • 从动态库调用函数

第二次函数调用是:

  1. 转到PLT
  2. 转到GOT
  3. GOT 可以从动态库直接跳转到函数地址。GOT 是对再次调用的函数的引用,而无需快速执行 _dl_runtime_resolve。
于 2013-12-05T11:59:26.483 回答
1

我在这里看到内存泄漏:

LdapDN当你这样做时,你基本上会丢失你以前的字符串

 if ( pos != std::string::npos ) {
            ldapDN = ldapDN.substr(pos);
            LdapDN = (char *)ldapDN.c_str();
            //getEntityPathFromLdapDn(ldapDN.c_str(), epath, domid);
        }
于 2012-05-20T00:43:38.600 回答