我有以下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;
答案 0 :(得分:0)
我认为你的程序在这一点上不应该有任何正当理由 - 这就是假设;
所有代码都使用相同的编译器编译
不同文件中的头文件编译方式不同(即更改头文件后不会忘记重新编译)。
我认为你最有可能在其他地方出现内存损坏,当你访问这个类时它会出现(运气不好)。尝试使用像valgrind或类似工具来跟踪其余代码所做的任何不好的事情。