void AppBuf(message_id_type msgID, int32 numPairs, va_list va)
{
int32 len = va_args(va, int32);
....
}
Приведенный выше фрагмент кода прекрасно работает на Windows (32- и 64-битной), а также на 32-битном компиляторе Linux.Значение 'len' составляет 10 для всего вышеперечисленного.
Но в linux 64 bit (x86_64 GNU / Linux) я получаю очень большое значение для len
(50462976
), которое портит остальную часть кода и приводит к сбою.
Я читал, что что-то изменилось в 64-битных компиляторах Linux по отношению к va_lists
, но я не смог понять это изменение и поэтому не смог исправить свою проблему.
МожетКто-нибудь, пожалуйста, помогите мне с этой проблемой?
Спасибо.
Солнечный
Хорошо, вот подробности всего кода, приводящего к этому вопросу: Может кто-нибудь помочь с этим?Заранее спасибо.
Стек вызовов:
AppendBuffers (int msgID = 0x00000001, int numPairs = 0x00000001, char * va = 0x0007fcb0) {ПРИМЕЧАНИЕ: этопроблема возникает, как указано выше (длина = очень большая)}
LogMsg (int msgID = 0x00000001, int numPairs = 0x00000001, char * arguments = 0x0007fcb0)
LogMsgBuffersV(int msgID = 0x00000001, int numPairs = 0x00000001, char * arguments = 0x0007fcb0)
LogMsgBuffersV (int msgID = 0x00000001, int numPairs = 0x00000001, char * аргументы = 0x0007fMBS 0 * 10 * 10)msgID = 0x00000001, int numPairs = 0x00000001, ...)
Фактический код:
void LogMsgBuffers(message_id_type msgID, int32 numPairs, ...)
{
va_list arguments;
va_start(arguments, numPairs);
filter_status_type msgStatus = FilterMsg(msgID);
if (msgStatus == FILTER_ACCEPT)
{
LogMsg(msgID, numPairs, arguments);
}
if ((_parentLogger != NULL) && (_oAppenderInheritance))
{
//Pass the msg to the parent
_parentLogger->LogMsgBuffersV(msgID, numPairs, arguments);
}
return;
}
void LogMsgBuffersV(message_id_type msgID, int32 numPairs, va_list arguments)
{
filter_status_type msgStatus = FilterMsg(msgID);
if (msgStatus == FILTER_ACCEPT)
{
//Log msg to the current node
LogMsg(msgID, numPairs, arguments);
}
if ((_parentLogger != NULL) && (_oAppenderInheritance))
{
//Pass the msg to the parent
_parentLogger->LogMsgBuffersV(msgID, numPairs, arguments);
}
return;
}
void LogMsgBuffersV(message_id_type msgID, int32 numPairs, va_list arguments)
{
filter_status_type msgStatus = FilterMsg(msgID);
if (msgStatus == FILTER_ACCEPT)
{
//Log msg to the current node
LogMsg(msgID, numPairs, arguments);
}
if ((_parentLogger != NULL) && (_oAppenderInheritance))
{
//Pass the msg to the parent
_parentLogger->LogMsgBuffersV(msgID, numPairs, arguments);
}
return;
}
void LogMsg(message_id_type msgID, int32 numPairs, va_list arguments)
{
uint32 i;
for (i = 0; i < _pOwnAppenderVec.size(); i++)
{
LoggerAppender *appender = _pOwnAppenderVec[i];
appender->AppendBuffers(msgID, numPairs, arguments);
}
return;
}
void AppendBuffers(message_id_type msgID, int32 numPairs, va_list va)
{
for (int32 i = 0; i < numPairs; i++)
{
int32 length = va_arg(va, int32);
uint8* buffer = va_arg(va, uint8*);
int32 jj;
for (jj = 10; jj < length; jj += 10)
{
AppendStringA(0, " %x %x %x %x %x %x %x %x %x %x", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7], buffer[8], buffer[9]);
buffer += 10;
}
uint8 remainderbuf[10];
uint32 remainder = length - (jj - 10);
if (remainder > 0 && remainder <= 10)
{
oscl_memcpy(remainderbuf, buffer, remainder);
oscl_memset(remainderbuf + remainder, 0, 10 - remainder);
buffer = remainderbuf;
AppendStringA(0, " %x %x %x %x %x %x %x %x %x %x", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7], buffer[8], buffer[9]);
}
}
va_end(va);
}