У нас есть приложение для установки, которое использует MFC и написано на c ++. Оно периодически прерывается при вставленном стеке вызовов.Этот сбой происходит, когда приложение заканчивается.Мы можем видеть ссылку atexit () в стеке вызовов со статической переменной svUniqueUpdates, которая используется внутри функции для некоторых вычислений.Действительно ли этот сбой вызван atexit () и как его исправить?
Стек вызовов
0 Id: 3f30.8d0 Приостановка: 1 Teb: 00000090 bbdf7000 Unfrozen
# Child-SP RetAddr : Args to Child : Call Site
00 00000090
bc1ffba8 00007ffa 7cc507b3 : 00000000
0000000000007ff6 1fec2370 0000b408
eb7e3e32 00007ffa 7fa05d78 : Install!
TotalUpdCount ':: 2'::
деструктор динамического атексита для' svUpdates '' 01 00000090 bc1ffbb0 00007ffa
7cc4ce0b: 00000090 bc1ffd00 00000090
bc1ffc88 00000090 bc1ffd20 00007ffa
7cd25cb: оператор uc (rc):0xc3 02 00000090 bc1ffc10 00007ffa
7cc506e4: 00000090 bc1ffd08 00007ffa
7cd25c80 00000000 00000000 00000090
bc1ffc78: ucrtbase! ____* bc1ffc70: ucrtbase! execute_onexit_table + 0x34 04 00000090 bc1ffc70 00007ffa
7cc4f5ab: 00000000 00000001 00000000
00000000 000001f7 ffffffff 00007ffa
684431a8: ucrtbase! :: оператор () + 0x65 05 00000090 bc1ffcb0 00007ffa
7cc46223: 00000000000000000000000000000000000000000000000000* bc1ffd00: ucrtbase! __crt_seh_guarded_call :: operator () <, & __ptr64,> + 0x3b 06 00000090 bc1ffce0 00007ff6
1fd110b0: 00000000 00000001 00000000
00000000 00000000 00000000 00000000
00000000: база данных ucrtbase!00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000: установить!00000000 00000000 00000000 00000000
00000000: ntdll! RtlUserThreadStart + 0x21
только код, использующий эту статическую переменную:
```TotalUpdCount(list<wchar_t *> &lvUpdates)
{
list<wchar_t *>::iterator svListIter;
map<wstring,int>::iterator svVecIter;
static map<wstring,int> svUpdates;
static bool svFirst=true;
if(svFirst)
{
svUpdates.clear();
svFirstTime=false;
}
for (svListIter = lvUpdates.begin();
svListIter != lvUpdates.end();
svListIter++)
{
wstring svTmpUpdate=*svListIter;
svVecIter = svUpdates.find(svTmpUpdate);
if (svVecIter == svUpdates.end())
svUpdates.insert(make_pair(svTmpUpdate, 1));
}
nvTotalUpdatesCnt = static_cast<int>(svUpdates.size());