Сбой при согласовании имени большой группы

Я не очень хорошо разбираюсь в C++ и Lotus Notes. У меня есть фрагмент кода, который печатает имя группы в журнале.

Util::AgentDebug("In Command::InitGroupMap(): Group Name = %s",lnGrpName.GetBuf());

lnGrpName — это LNstring. он работает нормально, но всякий раз, когда длина имени группы превышает 2200, происходит сбой.

вот пример - предположим, что имя группы

asd.Storage.Implementation; задача-mnncpohcpg01; задача-paersc2hcpg01; азскоттс02а; азскотс02b; ctshelns02a; ctshelns02b; флшонс03а; флшонс03b; iadubqns02a; iadubqns02b; мннкпоба0015; мннкпобркд01; mnncpoisobrcd01; mnncpoisobrcd02; мннкпоисов7к01; мннкполто01; мннкполто01_1; мннкполто01_имк; mnncpons03a; mnncpons03b; mnncpons900a_asd; mnncpons900b_asd; мннкпонс900с; mnncpons900c_asd; мннкпонс900д; мннкпонс900д_асд; мннкпонс900_асд; mnncpons900_sw1; mnncpons900_sw2; mnncposanc100; мннкпосанк200; мннкпосанр150; мннкпосанр250; мннкпосвк01; МННКПОФЛ9КР01; МННКПОФЛ9КР02; МННКПОНС900_sw1; МННКПОНС900_sw2; нжмадинс01а; нджмадинс01б; нджрос1нс05та; нджрос1нс05ТБ; нджвуднс05а; нджвуднс05б; NJCTMVSP01; p2erscba0145; paersc1ns900a_asd; paersc1ns900b_asd; paersc1ns900c; paersc1ns900d; paersc1ns900_sw1; paersc1ns900_sw2; paersc2ns900a_asd; paersc2ns900b_asd; paersc2ns900c; paersc2ns900d; paersc2ns900_sw1; paersc2ns900_sw2; paersc2ocum01; paersc2opm01; paerscns05; paerscnsv501a; paerscnsv501b; ПАКТМВСП01; ПАЕРСК1ФЛ9КР01; ПАЕРСК1ФЛ9КР02; PAERSC1LABBRCD01; PAERSC1LABBRCD02; PAERSC1LABSVC01; ПАЕРСК2ФЛ9КР01; ПАЕРСК2ФЛ9КР02; ПАЕРСК2ФЛ9КР03; PAERSC2LABBRCD01; PAERSC2LABBRCD02; PAERSC2LABSVC01; тксдаллнс02а; txdallns02b; МННКПОБА0014; paerscsvc03; njros1svc01; njros1svc02; p1ehowld202; p1ehowld203; p2ehowld202; p2ehowld203; мннкпольд202; мннкпольд203; МННКПОНС805_асд; МННКПОНС805а_асд; MNNCPONS805b_asd; MNNCPONS805b_asd; paersc2ns805_asd; paersc2ns805a_asd; paersc2ns805b_asd; мннкпоб15к01; paersc1g15k01; paersc2g15k01; paersc2sane103; paersc2sane203; P2ERSCBA0305; МННКПОБА0277; P2ERSCAPL0005; МННКПОАПЛ0016; p2erscba0147; мннкпоба0016; МННКПОЕССКН01; PAERSC2ECSCN01; ПАЕРСК2ФЛАР900_1; P2ERSCAPL0006; njros1labcisc100; нджрос1лабциск200; p1erscba0402; paersc2ns700_sw1; paersc2ns700_sw2; paersc2ns700a_asd; paersc2ns700b_asd; paersc2ns700_asd; paersc1ns700_sw1; paersc1ns700_sw2; paersc1ns700a_asd; paersc1ns700b_asd; paersc1ns700_asd; mnncpons700_sw1; mnncpons700_sw1; мннкпонс700_sw2; мннкпонс700а_асд; mnncpons700b_asd; mnncpons700c_asd; мннкпонс700д_асд; мннкпонс700_асд; p2erscba0346; p2erscba0146; paersc1ns500; paersc1ns500a_asd; paersc1ns500b_asd; paersc2ns500; paersc2ns500a_asd; paersc2ns500b_asd

эта проблема из-за LNString или GetBuf()?

Метод AgentDebug ниже -

void Util::AgentDebug( wchar_t * format , ... )
 {

wchar_t     tmp[2048];
va_list     args;
char        strBuff[4096];
int         j = 0;

va_start(args, format);
vswprintf_s(tmp, format, args);
va_end(args);

int cnt = wcstombs(strBuff, tmp, 4095);
if(cnt < 0)
{
    char *strInput = (char*)tmp;
    for( int i = 0; i < (wcslen(tmp) * 2); i++ )
    {
        if(strInput[i] != 0)
            strBuff[j++] = strInput[i];
    }
    strBuff[j] = '\0';
}
// AdkDebug (strBuff);
// Fix for IY98698 Certain Chinese character throws exception during recon (PMR10927999672)
// String to be logged is passed as second argument
AdkDebug("%s",strBuff);


 }// end of func AgentDebug()
  // end S15302

какова альтернатива этому, потому что я хочу напечатать имя группы в журнале.


person curiousMind    schedule 16.04.2019    source источник
comment
У вас есть имя группы, длина которого превышает 2200? Действительно? В любом случае, вы действительно должны показать нам трассировку стека, полученную при сбое. Это поможет дать подсказки, где ваша проблема.   -  person Richard Schwartz    schedule 16.04.2019
comment
@RichardSchwartz Я отредактировал вопрос, пожалуйста, проверьте его. Клиент дает такое имя.   -  person curiousMind    schedule 25.04.2019


Ответы (2)


Это больше похоже на список членов группы, чем на название группы, но ладно...

Я довольно ржавый в своих материалах C++ и va_args, но мне кажется, что ваш массив tmp может содержать только 2048 wchar_t, и я предполагаю, что вам нужен один wchar_t для нулевого терминатора, и у вас есть около 40 символов в вашем формате нить. Таким образом, вы переполняете tmp, когда передаете строку длиной 2200. Вы переполняете ее чем угодно, длина которого превышает 2007 — если я правильно посчитал.

person Richard Schwartz    schedule 25.04.2019

Я думал о том же? Имя группы длиной 2200 байт или символов? Ok. Я не знаю, как «исправить» вашу проблему, но если предположить, что вы не можете ее «исправить», чтобы «исправить», я бы либо обрезал строку, либо добавил строку в виде двух значений. Если строка длиннее 2150, разбейте ее на две строки и запишите обе в журнал. Просто мысль. Не могу сделать больше без дополнительной информации.

person Tim Williams    schedule 23.04.2019