0

在 Packet() 类中,我有这个方法可以自行封装数据包iteslf(即在它前面添加 6 字节的标头,但当然首先分配必要的内存)但是,它给了我一个* 堆栈粉碎检测到 *

int TmcPckt::EncapsulateCCSDS(void) {

    // packet identification in primary header
    UI16 primaryHdrPcktID;
    primaryHdrPcktID = (TMC_CCSDS_PKT_VR_NBR << TMC_CCSDS_OFFSET_PKT_VR_NBR)
                       | (this->_tmcDirection << TMC_CCSDS_OFFSET_PKT_ID_PKT_TYP)
                       | (TMC_CCSDS_PKT_ID_HDR_FLG << TMC_CCSDS_OFFSET_PKT_ID_HDR_FLG)
                       | (this->_appId  << TMC_CCSDS_OFFSET_PKT_ID_APP_ID);


    // sequence control in primary header
    UI16 primaryHdrSeqCtrl;
    primaryHdrSeqCtrl =   (TMC_CCSDS_PKT_SEC_CTRL_SEQ_FLG << TMC_CCSDS_OFFSET_PKT_SEC_CTRL_SEQ_FLG)
                        | (TMC_CCSDS_PKT_SEC_CTRL_SEQ_CNT << TMC_CCSDS_OFFSET_PKT_SEC_CTRL_SEQ_CNT);

    // packet length in primary header;
    // should be the length in bytes of entire packet except primary header minus 1
    UI16 primaryHdrPcktLen;
    primaryHdrPcktLen = this->_dataSize - 1;

    // convert data to network
    primaryHdrPcktID = htons(primaryHdrPcktID);
    primaryHdrSeqCtrl = htons(primaryHdrSeqCtrl);
    primaryHdrPcktLen = htons(primaryHdrPcktLen);

    // convert data to netwaSaSork
    for (int i = 0; i < this->_dataSize; i++)
    {
        this->_dataBuffer[i] = htons(this->_dataBuffer[i]);
    }

    this->_packetSize = TMC_CCSDS_PRIM_HDR_LEN_BYTES + this->_dataSize;

    this->_packetBuffer = (UI16 *) operator new(this->_packetSize/sizeof(UI16));

    // copy data to destination memory: headers
    this->_packetBuffer[TMC_CCSDS_PRIMARY_HDR_PCKT_ID] = primaryHdrPcktID;
    this->_packetBuffer[TMC_CCSDS_PRIMARY_HDR_SEQ_CTRL] = primaryHdrSeqCtrl;
    this->_packetBuffer[TMC_CCSDS_PRIMARY_HDR_PCKT_LEN] = primaryHdrPcktLen;


    // copy data to destination memory: payload
//    memcpy((void*) &this->_packetBuffer[TMC_CCSDS_DATA_PAYLOAD_AND_CMD], (void*) this->_dataBuffer, sizeof(UI16)*this->_dataSize);
    memcpy((void*) &this->_packetBuffer[TMC_CCSDS_DATA_PAYLOAD_AND_CMD], (void*) this->_dataBuffer, this->_dataSize);

    LogPrintBuffer(this->_packetBuffer, this->_packetSize/sizeof(UI16));

    this->_encapsulated = true;

    return STATUS_SUCCESS;
}

而且我想找出它在哪里(代码行)给出问题......:/我可以使用标志重新编译以避免检测但不能让我的程序出现段错误......所以我猜猜我不能在这里使用 gdb。(加上这在 g_timeout_add() 这样的线程中调用)

Valgrind 有什么用吗?我是否通过做一个永远不会被释放的 new() 来做一些丑陋/错误的事情

我可以这样做吗?

4

0 回答 0