В классе Packet () у меня есть этот метод, который сам инкапсулирует пакет сам по себе (т.е. добавляет перед ним 6 байтов заголовка, но, конечно, сначала выделяет необходимую память)
Тем не менее, это дает мне * Обнаружено разрушение стека *:
ИНТ
TmcPckt :: EncapsulateCCSDS (пустоты)
{
// 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 (), который никогда не будет освобожден
Могу ли я сделать это вместо этого?
Задача ещё не решена.
Других решений пока нет …