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ステートメントがある場所でクラッシュが発生しています。
LdapDNありchar *ません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通常、ランタイムローダーの状態が破損していることを意味します。

最も一般的な2つの原因は次のとおりです。

  1. ヒープの破損(オーバーフロー)または
  2. glibcそれ自体の不一致の部分。

LD_LIBRARY_PATHたとえば、非標準を指すように設定していない場合はglibc、理由2を忘れることができます。

#1の場合、Valgrindでプログラムを実行し、エラーが検出されないことを確認します。

実際にそうでない場合は、GDBコマンドを使用disasinfo registers、その出力で質問を更新してください。追加のヘルプが表示される場合があります。

于 2012-05-19T21:11:10.210 に答える
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 に答える