访问类的std :: string时崩溃

时间:2016-03-01 13:57:14

标签: c++ linux stdstring coredump

我有以下coredump。

Program terminated with signal 11, Segmentation fault.
#0  0xb5b1c2f8 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
   from /arm-none-linux-gnueabi/libc_m/usr/lib/libstdc++.so.6
#0  0xb5b1c2f8 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
   from /arm-none-linux-gnueabi/libc_m/usr/lib/libstdc++.so.6
#1  0x00964f5c in Qct::OamClientUtil::getRsp (this=<value optimized out>)
at /Agent/include/oamClientUtil.hpp:92
#2  0x00902118 in MapPM::sendCollect (this=0xb4af9928) at /gent/src/mapPM.cc:557
#3  0x00921dc0 in Agent::handlePMCollectReq (this=<value optimized out>, buf=0xb335ccb0)
at /Agent/src/Agent.cc:5671
#4  0x0095deb4 in AgentRxHandler (handle=<value optimized out>, buf=0xb335ccb0)
at /Agent/src/uslAgent.cc:398
#5  0x0080f364 in uslDCTEntry (dct=20401048) at /usl/src/lcid/uslDCT.cc:253
#6  0x009c867c in TASK::taskEntryPoint (params=0x1375098) at /emvxworks/taskLib.cpp:224
#7  0x009c7bbc in pthreadw_taskentry (arg=<value optimized out>) at /emvxworks/pthread_wrapper.cpp:786
#8  0xb59a6120 in start_thread (arg=0xb4aff460) at pthread_create.c:307
#9  0xb592e9f8 in nfsservctl ()
from /CodeSourcery/4.6.3-2012.03-57/arm-none-linux-gnueabi/libc_m/lib/libc.so.6
Backtrace stopped: frame did not save the PC 

我很困惑一个简单的字符串如何导致崩溃。

由于代码非常大,我现在将粘贴相关的类。如果需要,将添加更多。

/Agent/include/oamClientUtil.hpp:92

37    class OamClientUtil
38    {
39    public:
40        OamClientUtil();
41
42        virtual
43        ~OamClientUtil();
44
45        
46        void
47        initOamProxyConn();
48
49        void
50        setBatch(
51            OamClients& batch
52        );
53
54        /// load oam transactions from a file
55        /// and convert them to a list of oam client transactions
56        bool
57        loadTrxFromFile(
58            std::string& batchfilename
59        );
60
61        /// actual processing the list of transactions
62        MgmtResult
63        run();
64
65        bool
66        isGood();
67
68        /// return the dryrun flag
69        bool
70        isDryrun();
71
72        /// set the dryrun flag
73        bool
74        isDryrun(bool flag);
75
76        const OamErrorString&
77        errorString() const;
78
79        
80        void
81        initRsp() {
82            getRsp_ = "";
83        }
84        void
85        initKeyRsp() {
86            getKeysRsp_ = "";
87        }
88
89        
90        std::string
91        getRsp() {
92            return getRsp_;
93        }
94        std::string
95        getKeysRsp() {
96            return getKeysRsp_;
97        }
98        bool
99        getKeysLast() {
100            return getKeysLast_;
101        }
102    private:
103        static const unsigned REQ_TIMEOUT_SECS = 10;
104
105        /// send get request
106        MgmtResult
107        sendGetReq(
108            OamClientTrxPtr trx
109        );
110
111        /// send getKeys request
112        MgmtResult
113        sendGetKeysReq(
114            OamClientTrxPtr trx
115        );
116        /// send set request
117        MgmtResult
118        sendSetReq(
119            OamClientTrxPtr trx
120        );
121
122        /// send clear request
123        MgmtResult
124        sendClearReq(
125            OamClientTrxPtr trx
126        );
127
128        /// process the list of transactions
129        MgmtResult
130        processTransactionList(
131            OamClientTrxList& trxlist ///< The list of transaction to be processed
132        );
133
134        /// process one transaction
135        MgmtResult
136        processTransaction(
137            OamClientTrxPtr trx ///< The transaction to be processed
138        );
139
140        /// print content of one transaction
141        void
142        printRequests(
143            OamClientTrxPtr trx
144        );
145
146        void
147        indCallback(
148            unsigned int msgId,
149            QctUint8_t* indMsgBuffer,
150            unsigned int indMsgBufferLength);
151
152        
153        static ProvisioningPtr
154        initProvisioningPtr();
155
156        
157        static MgmtXmlPtr
158        initMgmtXmlPtr();
159
160        QmiClient qmiClient_;
161        MgmtXmlPtr mgmtXmlPtr_;
162        OamClients batch_;
163        SerialStreamFixedBuf<QMI_FSM_OAM_CLIENT_MAX_LENGTH_V04> sstream_;
164        QctUint16_t trxid_;
165
166        std::string batchfilename_;
167        bool isDryrun_; 
168        bool isGood_;
169        QctUint32_t oamSessionId_;
170        OamErrorString errorMsg_;
171        std::string getRsp_; 
172        std::string getKeysRsp_; 
173        bool getKeysLast_; 
174        ProvisioningPtr provisioningPtr_;
175    };
176




#2  0x00902118 in MapPM::sendCollect (this=0xb4af9928) at /Agent/src/mapPM.cc:557



    549Qct::MgmtResult MapPM::sendCollect()
    550{
    551    clUtil_.initRsp();
    552    clUtil_.setBatch(oamClients_);
    553    Qct::MgmtResult mr = clUtil_.run(); // process every transaction in oamClients_
    554    if (mr == Qct::MGMT_RESULT_FAIL) {
    555      //return Qct::MGMT_RESULT_FAIL;
    556    }
    557    return makePMFile(clUtil_.getRsp());
    558
    }

clUtil_ is object of Qct::OamClientUtil  
    Qct::OamClientUtil clUtil_;

/Agent/src/Agent.cc:5671

    5671    Qct::MgmtResult result = mapPM.sendCollect();

/Agent/src/uslAgent.cc:398

    400      case OAM_AGENT_PMSETUP:
    401          oamAgent.handlePMSetupReq(buf);
    402          break;

1 个答案:

答案 0 :(得分:0)

我认为你的程序在这一点上不应该有任何正当理由 - 这就是假设;

  • 所有代码都使用相同的编译器编译

  • 不同文件中的头文件编译方式不同(即更改头文件后不会忘记重新编译)。

我认为你最有可能在其他地方出现内存损坏,当你访问这个类时它会出现(运气不好)。尝试使用像valgrind或类似工具来跟踪其余代码所做的任何不好的事情。