【问题标题】:crash while accessing the std::string of a class访问类的 std::string 时崩溃
【发布时间】:2016-03-01 13:57:14
【问题描述】:

我有以下核心转储。

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;

【问题讨论】:

  • 您应该将您的代码剥离为MCVE 以提出更合理的问题。作为奖励,它也是一种不错的调试技术,您可能会在途中发现问题。我们至少需要看到/Agent/src/uslAgent.cc:398
  • "我很困惑一个简单的字符串是如何导致崩溃的。" -- 简单。包含该字符串的对象可能无效。
  • @BoBTFish 我觉得这与声明的顺序有关,所以我发布了整个课程,否则一开始就是一个片段。
  • std::string 在堆上分配,使用正确的运行时库很重要,例如两者 /MT 或两者 /MD
  • @punith 即使您更改了声明的顺序并注意到应用程序的工作方式有所不同,除非这是对象初始化的问题(顺序会有所不同,特别是如果您编写成员初始化列表中的代码取决于顺序),那么这仅表明您在某处损坏了内存。移动代码行并具有不同的行为是这种损坏的标志。

标签: c++ linux stdstring coredump


【解决方案1】:

我认为你的程序此时崩溃不应该有任何正当理由——假设是这样;

  • 所有代码都用同一个编译器编译过

  • 头文件在不同文件中的编译方式不同(即你没有忘记在更改头文件后重新编译某些东西)。

我认为您很可能在其他地方存在内存损坏,并且在您访问此类时会显示(运气不好)。尝试使用 valgrind 或类似工具来追踪其余代码所做的任何坏事。

【讨论】:

    猜你喜欢
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多