Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
Всем привет! Столкнулся с проблемой в приложении и не могу разобраться как его отладить, потому что в снятых дампах я вижу какую-то неадекватную херь. Исходные данные вкратце и упрощенно: Visual Studio 2015.3 (SDK 10.0.15063.0) / WinDBG 10.0.15063.0 Есть базовый шаблонный класс, управляющий массивом объектов на базе другого класса: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. Есть несколько классов, использующих CFarm, объявленных как Код: plaintext 1. 2. 3. Думаю, логика ясна. Само собой, в каких-то из них переопределены виртуальные функции DestroyServer / DestroyServerInternal как надо классам. Приложение в котором, работает этот код, может работать нормально месяцами, а потом внезапно упасть (что затрудняет отладку по живому, кстати). В дампе я вижу, что все указывает на ошибку именно в данных классах и функциях, но что самое интересное в стеке вызовов я вижу какую-то неадекватную пургу: 00 00000000`039cdf98 000007fe`fda91430 ntdll!NtWaitForMultipleObjects+0xa 01 00000000`039cdfa0 00000000`779516e3 KERNELBASE!WaitForMultipleObjectsEx+0xe8 02 00000000`039ce0a0 00000000`779cb8b5 kernel32!WaitForMultipleObjectsExImplementation+0xb3 03 00000000`039ce130 00000000`779cba37 kernel32!WerpReportFaultInternal+0x215 04 00000000`039ce1d0 00000000`779cba8f kernel32!WerpReportFault+0x77 05 00000000`039ce200 00000000`779cbcac kernel32!BasepReportFault+0x1f 06 00000000`039ce230 00000000`77bd0108 kernel32!UnhandledExceptionFilter+0x1fc 07 00000000`039ce310 00000000`77b67958 ntdll! ?? ::FNODOBFM::`string'+0x2025 08 00000000`039ce340 00000000`77b7812d ntdll!_C_specific_handler+0x8c 09 00000000`039ce3b0 00000000`77b6855f ntdll!RtlpExecuteHandlerForException+0xd 0a 00000000`039ce3e0 00000000`77b9bcb8 ntdll!RtlDispatchException+0x45a 0b 00000000`039ceac0 00000001`3f44b95a ntdll!KiUserExceptionDispatch+0x2e 0c (Inline Function) --------`-------- my_buggy_app! CFarm<CRdpServer> ::DestroyServerInternal+0x1f 0d 00000000`039cf1f0 00000001`3f44ba16 my_buggy_app! CFarm<CRdpServer> ::DeleteServerInternal+0x5a 0e 00000000`039cf220 00000001`3f44bffa my_buggy_app!CFarm<CWebServer>::DeleteServerInternal+0x66 0f 00000000`039cf260 00000001`3f44d7c8 my_buggy_app!CFarm<CWebServer>::DeleteServer+0x4a 10 00000000`039cf2b0 00000001`3f4526e4 my_buggy_app! CFarm<CRdpServer> ::Query+0x188 11 00000000`039cf350 00000001`3f4529c7 my_buggy_app! CRdpCluster ::ExecuteRequest+0xc4 12 00000000`039cf3c0 00000001`3f4683f2 my_buggy_app! CRdpCluster ::LookupSessions+0x27 13 00000000`039cf400 00000001`3f4640c1 my_buggy_app!CExtRequest::ExecuteGetRdpSessions+0x112 14 00000000`039cf490 00000001`3f4437b6 my_buggy_app!CExtRequest::Execute+0x4e1 15 00000000`039cf540 00000001`3f438237 my_buggy_app!CExternalPool::OnNewRequest+0x3a6 16 (Inline Function) --------`-------- my_buggy_app!CRequestPool::__sOnNewRequest+0x17 17 00000000`039cf630 00000001`3f447933 my_buggy_app!CSSLSession::WaitForSessionComplete+0xf7 18 00000000`039cf680 00000001`3f43c9ec my_buggy_app!CRequestPool::OnNewConnection+0x103 19 (Inline Function) --------`-------- my_buggy_app!CPoolTask::CallTaskRoutine+0x13 1a 00000000`039cf6e0 00000001`3f43ba6c my_buggy_app!CPoolTask::Execute+0x7c 1b 00000000`039cf730 00000001`3f480ee0 my_buggy_app!CThreadPool::__sThreadPoolWorker+0x14c 1c (Inline Function) --------`-------- my_buggy_app!invoke_thread_procedure+0xd [minkernel\crts\ucrt\src\appcrt\startup\thread.cpp @ 91] 1d 00000000`039cf770 00000000`779459cd my_buggy_app!thread_start<unsigned int (__cdecl*)(void * __ptr64)>+0x50 [minkernel\crts\ucrt\src\appcrt\startup\thread.cpp @ 115] 1e 00000000`039cf7a0 00000000`77b7a561 kernel32!BaseThreadInitThunk+0xd 1f 00000000`039cf7d0 00000000`00000000 ntdll!RtlUserThreadStart+0x1d Самое главное здесь то, что есть пул потоков, который обслуживает запросы к ферме серверов в отдельных потоках. Разумеется запросы к RDP серверам НЕ пересекаются с запросами к WEB серверам и т.д., но после завершения запроса к RDP ферме, как видно из дампа стека, в процесс очистки вкрячивается совершенно левый здесь класс WEB фермы (выделено жирным). В некоторых дампах при запросах к WEB ферме я вижу пересечение с SQL фермой и т.д. Это не первый и не единственный дамп, который я собрал за все время анализа, так что наврят ли это косяк в дампе. Во всех дампах одна и та же проблема: в код одного класса подмешивается код другого, не имеющего общей логики, кроме базового класса. Тоже самое показывает и Visual Studio, если открыть дамп в ней. То есть работает СRdpFarm, но с примесью CWebFarm! Из-за этого я не могу нормально понять причину бага, потому что все перепутанно и нет никакой логики. Как такое может быть? Почему вдруг в стек попал совершенно левый класс? Такое поведение это нормально при использовании шаблонных классов вообще (я редко их использую)? Может мне стоит трактовать это не как вызов из WEB-класса, а как обращение к RDP-классу просто из-за общего базового класса отладчики путают их имена ? -------------------------------------------------------------- o(O_O)o ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 14:46 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
CerebrumКак такое может быть? Почему вдруг в стек попал совершенно левый класс? Вероятно, из-за виртуальности DeleteServer. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 15:31 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
Адреса функций трейса берутся из стека текущего потока. Если там что-то не то отображается, значит стек поврежден. Либо у вас в текущем потоке выход за границы локального массива, либо другой поток записал чтото туда (например по ссылке переданной из текущего потока вместо копирования) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 16:22 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, вот небольшой кусок raw стека потока (полный стек раз в 20 больше, поэтому его выкладывать целиком не вижу смысла). В нем также прослеживается обращение к web ферме. стек0:083> !teb TEB at 000007fffff9a000 ExceptionList: 0000000000000000 StackBase: 00000000039d0000 StackLimit: 00000000039c7000 SubSystemTib: 0000000000000000 FiberData: 0000000000001e00 ArbitraryUserPointer: 0000000000000000 Self: 000007fffff9a000 EnvironmentPointer: 0000000000000000 ClientId: 00000000000009b4 . 0000000000001258 RpcHandle: 0000000000000000 Tls Storage: 0000000002d1a810 PEB Address: 000007fffffdf000 LastErrorValue: 0 LastStatusValue: c0000302 Count Owned Locks: 0 HardErrorMode: 0 0:083> dps 00000000039c7000 00000000039d0000 . . . 00000000`039cf030 00000000`00000000 00000000`039cf038 00000000`00000000 00000000`039cf040 00000000`00000000 00000000`039cf048 00000001`3f43c0ee my_buggy_app!CThreadPool::CreateWorker+0x18e 00000000`039cf050 00000001`3f44b95a my_buggy_app!CFarm<CRdpServer>::DeleteServerInternal+0x5a 00000000`039cf058 00000000`0029a6c0 00000000`039cf060 00000000`0c568410 00000000`039cf068 00000000`039cf1f0 00000000`039cf070 00000000`00000000 00000000`039cf078 00000000`0000081c 00000000`039cf080 00000000`00000000 00000000`039cf088 00000000`00000000 00000000`039cf090 00000000`00000000 00000000`039cf098 00000000`00000000 00000000`039cf0a0 00000000`00000000 00000000`039cf0a8 00000000`00000000 00000000`039cf0b0 00000000`00000000 00000000`039cf0b8 00000000`00000000 00000000`039cf0c0 00000000`00282e90 00000000`039cf0c8 00000001`3f43c0ee my_buggy_app!CThreadPool::CreateWorker+0x18e 00000000`039cf0d0 00000000`00282eb0 00000000`039cf0d8 00000000`0029a6c0 00000000`039cf0e0 00000000`0c568350 00000000`039cf0e8 00000001`3f483e4c my_buggy_app!_free_base+0x1c 00000000`039cf0f0 00000000`00000000 00000000`039cf0f8 00000000`00001628 00000000`039cf100 00000000`0c6b8770 00000000`039cf108 00000000`00000001 00000000`039cf110 00000000`00282e90 00000000`039cf118 00000001`3f43bf43 my_buggy_app!CThreadPool::CheckQueuedTasks+0xd3 00000000`039cf120 00000000`12e66440 00000000`039cf128 00000000`00000001 00000000`039cf130 00000000`00282eb0 00000000`039cf138 00000000`12e64988 00000000`039cf140 00000000`00282e90 00000000`039cf148 00000001`3f43c0ee my_buggy_app!CThreadPool::CreateWorker+0x18e 00000000`039cf150 00000000`00282eb0 00000000`039cf158 00000000`0029a6c0 00000000`039cf160 00000000`02aca530 00000000`039cf168 00000001`3f483e4c my_buggy_app!_free_base+0x1c [minkernel\crts\ucrt\src\appcrt\heap\free_base.cpp @ 112] 00000000`039cf170 00000000`00000000 00000000`039cf178 00000000`00000ad4 00000000`039cf180 00000000`002ef570 00000000`039cf188 00000000`00000001 00000000`039cf190 00000000`00282e90 00000000`039cf198 00000000`77b98fe8 ntdll!RtlLeaveCriticalSection+0x7b 00000000`039cf1a0 00000000`12e64980 00000000`039cf1a8 00000000`00000001 00000000`039cf1b0 00000000`00282eb0 00000000`039cf1b8 00000000`12efa948 00000000`039cf1c0 00000000`0029a6c0 00000000`039cf1c8 00000001`3f43c0ee my_buggy_app!CThreadPool::CreateWorker+0x18e 00000000`039cf1d0 00000000`00282e90 00000000`039cf1d8 00000000`0029a6c0 00000000`039cf1e0 00000000`00282eb0 00000000`039cf1e8 00000001`3f44b94f my_buggy_app!CFarm<CRdpServer>::DeleteServerInternal+0x4f 00000000`039cf1f0 00000000`00000000 00000000`039cf1f8 00000000`00000000 00000000`039cf200 00000000`00282e90 00000000`039cf208 000007fe`fda910ac KERNELBASE!WaitForSingleObjectEx+0x79 00000000`039cf210 00000000`002953b0 00000000`039cf218 00000001`3f44ba16 my_buggy_app!CFarm<CWebFarm>::DeleteServerInternal+0x66 00000000`039cf220 00000000`02a14b90 00000000`039cf228 00000000`00000001 00000000`039cf230 00000000`00000102 00000000`039cf238 ffffffff`4d2fa200 00000000`039cf240 00000000`00000001 00000000`039cf248 00000000`00282e90 00000000`039cf250 00000000`00001337 00000000`039cf258 00000001`3f44bffa my_buggy_app!CFarm<CWebFarm>::DeleteServer+0x4a 00000000`039cf260 00000000`02a14b90 00000000`039cf268 00000000`00001337 00000000`039cf270 00000000`00282f60 00000000`039cf278 00000000`00000000 00000000`039cf280 00000000`00000000 00000000`039cf288 00000001`3f49fb20 my_buggy_app!CCriticalSection::`vftable' 00000000`039cf290 00000001`3f453a70 my_buggy_app!CRdpCluster::__sLookupSessions 00000000`039cf298 00000000`02a10150 00000000`039cf2a0 00000000`02a10150 00000000`039cf2a8 00000001`3f44d7c8 my_buggy_app!CFarm<CRdpServer>::QueryFarm+0x188 00000000`039cf2b0 00000000`00001337 00000000`039cf2b8 00000000`00000d28 00000000`039cf2c0 00000000`00000001 00000000`039cf2c8 00000000`00000d28 00000000`039cf2d0 00000000`02a9adb0 00000000`039cf2d8 00000000`00001337 00000000`039cf2e0 ffffffff`fffffffe 00000000`039cf2e8 00000001`3f49fb40 my_buggy_app!CSlimRwLock::`vftable' 00000000`039cf2f0 00000000`00000000 00000000`039cf2f8 00000000`00282f58 00000000`039cf300 00000000`02a9adb0 00000000`039cf308 00000001`3f44d851 my_buggy_app!CFarm<CRdpServer>::QueryFarm+0x21 00000000`039cf310 ffffffff`fffffffe 00000000`039cf318 00000000`00000001 00000000`039cf320 00000000`002dc200 00000000`039cf328 00000000`02a9a630 00000000`039cf330 00000000`00000001 00000000`039cf338 00000000`00000000 00000000`039cf340 00000000`00001337 00000000`039cf348 00000001`3f4526e4 my_buggy_app!CRdpCluster::ExecuteRequest+0xc4 00000000`039cf350 00000000`00000d28 00000000`039cf358 00000000`02a9adb0 00000000`039cf360 00000000`00000001 00000000`039cf368 00000000`002dc200 00000000`039cf370 00000000`00001337 00000000`039cf378 00000001`000493e0 00000000`039cf380 00000000`00000001 00000000`039cf388 00000000`039cf448 00000000`039cf390 00000000`022bd520 00000000`039cf398 00000001`3f46a92b my_buggy_app!CExtRequest::GatherRequestParticipants+0x15b 00000000`039cf3a0 000000ff`00000000 00000000`039cf3a8 00000000`00000000 00000000`039cf3b0 00000000`00282e90 00000000`039cf3b8 00000001`3f4529c7 my_buggy_app!CRdpCluster::LookupSessions+0x27 00000000`039cf3c0 00000000`02a9adb0 00000000`039cf3c8 00000000`00002773 00000000`039cf3d0 ffffffff`fffffffe 00000000`039cf3d8 00000000`00282e90 00000000`039cf3e0 00000000`00001337 00000000`039cf3e8 00000000`000493e0 00000000`039cf3f0 00000000`00282e90 00000000`039cf3f8 00000001`3f4683f2 my_buggy_app!CExtRequest::ExecuteGetRdpSessions+0x112 00000000`039cf400 00000000`002f9610 00000000`039cf408 00000000`02a9adb0 00000000`039cf410 00000000`002dc200 00000000`039cf418 00000000`002dc200 00000000`039cf420 00000000`00000000 00000000`039cf428 00000000`00000000 00000000`039cf430 ffffffff`fffffffe 00000000`039cf438 00000000`02a9adb0 00000000`039cf440 00000000`002de280 00000000`039cf448 00000000`00000001 00000000`039cf450 00000000`02cf2ae0 00000000`039cf458 00000000`02cf2ae8 00000000`039cf460 00000000`02cf2b30 00000000`039cf468 00000001`3f43d6ab my_buggy_app!ResourceCacheBase<wchar_t * __ptr64,ResStringAllocator<wchar_t>,ResFreeDeallocator<wchar_t>,void>::Load+0x2b 00000000`039cf470 00000000`00291440 00000000`039cf478 00000000`00282e90 00000000`039cf480 00000000`02a10b10 00000000`039cf488 00000001`3f4640c1 my_buggy_app!CExtRequest::Execute+0x4e1 00000000`039cf490 00000000`00000000 00000000`039cf498 00000000`002c9c00 00000000`039cf4a0 00000000`002db870 00000000`039cf4a8 00000001`3f444142 my_buggy_app!CExternalPool::LogImpl+0xd2 00000000`039cf4b0 00000000`002de280 00000000`039cf4b8 00000000`00000000 00000000`039cf4c0 00000000`002de280 00000000`039cf4c8 00000000`00000000 00000000`039cf4d0 ffffffff`ffff0004 00000000`039cf4d8 00000000`00000000 00000000`039cf4e0 ffffffff`fffffffe 00000000`039cf4e8 00000001`00000000 00000000`039cf4f0 00000000`00000000 00000000`039cf4f8 00000000`00000000 00000000`039cf500 00000000`002de280 00000000`039cf508 ffffffff`fffffffe 00000000`039cf510 00000000`0296f530 00000000`039cf518 00000000`00291440 00000000`039cf520 00000000`00000001 00000000`039cf528 00000000`00000000 00000000`039cf530 00000000`029036f0 00000000`039cf538 00000001`3f4437b6 my_buggy_app!CExternalPool::OnNewRequest+0x3a6 . . . По данному куску можно сделать вывод о целостности стека ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 17:01 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
Cerebrum, 00000000`039cf2a8 00000001`3f44d7c8 my_buggy_app!CFarm<CRdpServer>::QueryFarm+0x188 00000000`039cf308 00000001`3f44d851 my_buggy_app!CFarm<CRdpServer>::QueryFarm+0x21 Вот эти два вызова из QueryFarm() намекают на рекурсию. Может тут собака порылась. Надо смотреть код этой функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 18:41 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
Да, согласен. Меня тоже как-то напрягают множество вызовов CThreadPool::CreateWorker, такого быть в принципе не должно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 19:58 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
Cerebrum, тебе нужно собрать программу в Release, но без оптимизации -O0, тогда дампы будут адекватные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 08:03 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
Cerebrum, ИМХО сюда Код: plaintext 1. 2. Приезжает неверная кастизация . возможно там даже объект правильного типа, но по каким то причинам он где то явно или не явно кастуется к неверному типу изза этого происходит вызов не той функции из иерархии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 09:49 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
д0kХ, тоже думал об этом, что код где-то заблудился в типах, если ничего не измениться то попробую написать классы без шаблонов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 10:42 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Тоже вариант. Надо попробовать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 10:42 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
CerebrumMasterZiv, Тоже вариант. Надо попробовать debug версию оставлял где-то на сутки работать, хотел отследить по-горячему, но так и не дождался - все работало без нареканий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 10:53 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
д0kХПриезжает неверная кастизация . возможно там даже объект правильного типа, но по каким то причинам он где то явно или не явно кастуется к неверному типу изза этого происходит вызов не той функции из иерархии.шаблоны неявно друг к другу не кастуются, надо искать в коде или C-style каст, или reinterpret_cast, который просто так не пишут. всё же, повреждение стека выглядит более правильной догадкой, имхо P.S. было бы интересно узнать результат, когда он будет достигнут, естественно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 12:52 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
egorychP.S. было бы интересно узнать результат, когда он будет достигнут, естественно) торжественно клянусь отписаться, если он будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 13:12 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
Cerebrumесли он будет"когда", только "когда", никаких если )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 13:21 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
egorych"когда", только "когда", никаких если )) Это же многопоточность. Там только "если" бывает ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 20:03 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
CerebrumCerebrumMasterZiv, Тоже вариант. Надо попробовать debug версию оставлял где-то на сутки работать, хотел отследить по-горячему, но так и не дождался - все работало без нареканий. надо не Debug, a release но без оптимизации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2017, 23:20 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
Cerebrum, обычно самая простая причина в таких стэках это использование объекта который уже удалён и его память выделили на другой объект может у вас синхронизация где-то нарушена при доступе к m_pvServers? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2017, 20:06 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
Итак, проблему удалось локализовать и воспроизвести на постоянной основе. 100% в Release сборке и иногда в Debug. Окончательного решения пока не найдено, поскольку логика работы приложения намного сложнее, чем я описал в самом начале и пока есть несколько непонятных моментов с гонкой потоков, но не думаю, что это кому-то интересно в рамках поднятого вопроса о корректности стека. На данный момент понятно следующее: - мешанина из классов в стеке не имеет ничего общего с реальной картиной происходящего и связана только с логикой самих отладчиков и проживающих в них тараканах. Причем не помогает даже полное отключение оптимизации в release сборке - все равно классы в перемешку, и их нужно рассматривать исходя из логики приложения (в моем случае обращения к пулу потоков для конкретного типа серверов), а не из того, что показывает стек. Я уже видел нечто подобное в книге по анализу дампов . Скорее всего мой случай из этой же когорты. - отладчик в Visual Studio 2015, по сравнению с windbg, проигрывает и может скрывать часть информации о вызванных функциях в анализируемом стеке потока, даже при одинаковых pdb. Я не берусь утверждать, что это аксиома, но иногда, в сложных случаях, именно windbg показывает более адекватный стек, нежели чем VS. Сам с этим сталкиваюсь не первый раз и только благодаря windbg удается локализовать проблему гораздо быстрее. Поэтому, если у вас есть postmortem дамп, который вы хотите проанализировать, то не ограничивайтесь только запихиванием его в VS, для сравнения также прогоните его в windbg, можете узнать много нового и более точно локализуете проблему. По сравнению с той версией, которую я использовал в начале анализа проблемы, версия из состава Windows SDK 10.0.15063. 400 позволила увидеть более адекватный стек вызовов, хоть с мешаниной из классов, но, по крайней мере, ведущий к действительному месту падения и его причине - повреждению кучи при попытке повторной очистки ранее удаленного объекта. BUCKET_ID: HEAP_CORRUPTION_ACTIONABLE_BlockNotBusy_DOUBLE_FREE_my_buggy_app!_free_base+1c дамп из WinDbg 10.0.15063.40008 000000eb`2811d550 00007ff8`59950c6a ntdll!KiUserApcDispatch+0x2e 09 000000eb`2811da48 00007ff8`5998b57e ntdll!NtWaitForMultipleObjects+0xa 0a 000000eb`2811da50 00007ff8`5998b0dc ntdll!RtlReportExceptionEx+0x452 0b 000000eb`2811e020 00007ff8`599b1c56 ntdll!RtlReportException+0xbc 0c 000000eb`2811e0b0 00007ff8`59941d86 ntdll!RtlReportCriticalFailure$filt$0+0x33 0d 000000eb`2811e0e0 00007ff8`5995026e ntdll!_C_specific_handler+0x96 0e 000000eb`2811e150 00007ff8`599533fd ntdll!_GSHandlerCheck_SEH+0x76 0f 000000eb`2811e180 00007ff8`59914847 ntdll!RtlpExecuteHandlerForException+0xd 10 000000eb`2811e1b0 00007ff8`59913a6d ntdll!RtlDispatchException+0x197 11 000000eb`2811e880 00007ff8`599b1c00 ntdll!RtlRaiseException+0x18d 12 000000eb`2811f040 00007ff8`599b4e42 ntdll!RtlReportCriticalFailure+0x8c 13 000000eb`2811f150 00007ff8`599b5a40 ntdll!RtlpHeapHandleError+0x12 14 000000eb`2811f180 00007ff8`5996a56f ntdll!RtlpLogHeapFailure+0xa4 15 000000eb`2811f1b0 00007ff7`605c4e20 ntdll! RtlFreeHeap +0x74eff 16 000000eb`2811f250 00007ff7`6057e4ea my_buggy_app![b]_free_base +0x1c [minkernel\crts\ucrt\src\appcrt\heap\free_base.cpp @ 112] 17 000000eb`2811f280 00007ff7`6058d52c my_buggy_app!CPoolTask::`scalar deleting destructor'+0x5a[/b] 18 (Inline Function) --------`-------- my_buggy_app!CCluster<CRdpFarm>::DestroyTaskInternal+0x21 19 000000eb`2811f2b0 00007ff7`6058d5e6 my_buggy_app!CCluster<CRdpFarm>::DeleteTaskGroupInternal+0x5c 1a 000000eb`2811f2e0 00007ff7`6058dbca my_buggy_app!CCluster<CWebFarm>::DeleteTaskGroupInternal+0x66 1b 000000eb`2811f320 00007ff7`60591728 my_buggy_app!CCluster<CWebFarm>::DeleteTaskGroup+0x4a 1c 000000eb`2811f370 00007ff7`6059bfb4 my_buggy_app!CCluster<CWebFarm>::QueryFarm+0x188 1d 000000eb`2811f410 00007ff7`6059beb7 my_buggy_app!CWebCluster::ExecuteRequest+0xc4 1e 000000eb`2811f480 00007ff7`60587ca4 my_buggy_app!CWebCluster::EnumApplications+0x27 1f 000000eb`2811f4c0 00007ff8`5995242e my_buggy_app!CInternalPool::OnWebTransferTimer+0x1a4 20 000000eb`2811f5a0 00007ff8`599506fa ntdll!KiUserApcDispatch+0x2e 21 000000eb`2811fa98 00007ff8`56b11118 ntdll!NtWaitForSingleObject+0xa 22 000000eb`2811faa0 00007ff7`60588c9b KERNELBASE!WaitForSingleObjectEx+0x94 23 000000eb`2811fb40 00007ff7`6057e563 my_buggy_app!CInternalPool::__sWebTransferTimerThread+0x10b 24 (Inline Function) --------`-------- my_buggy_app!CPoolTask::CallTaskRoutine+0x13 25 000000eb`2811fbb0 00007ff7`6057d5fc my_buggy_app!CPoolTask::Execute+0x63 26 000000eb`2811fbe0 00007ff7`605c1eb4 my_buggy_app!CThreadPool::__sThreadPoolWorker+0x14c 27 (Inline Function) --------`-------- my_buggy_app!invoke_thread_procedure+0xd [minkernel\crts\ucrt\src\appcrt\startup\thread.cpp @ 91] 28 000000eb`2811fc20 00007ff8`58d713d2 my_buggy_app!thread_start<unsigned int (__cdecl*)(void * __ptr64)>+0x50 [minkernel\crts\ucrt\src\appcrt\startup\thread.cpp @ 115] 29 000000eb`2811fc50 00007ff8`598d54e4 kernel32!BaseThreadInitThunk+0x22 2a 000000eb`2811fc80 00000000`00000000 ntdll!RtlUserThreadStart+0x34 Дамп отличается от первоначального, но проблема та же самая и происходит в том же самом месте при аналогичных обстоятельствах, так что пусть это никого не смущает. Самое главное здесь - более корректный стек вызовов с указанием точной причины возникшей проблемы, с которой мне и предстоит разбираться в дальнейшем, но это уже тема для другого топика... Всем откликнувшимся спасибо за участие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 14:21 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
Cerebrum, в select_heap() учтены барьеры процессора и инконсистентность кэша при обращении из разных потоков на разных ядра/процессорах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 14:30 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
rdb_devCerebrum, в select_heap() учтены барьеры процессора и инконсистентность кэша при обращении из разных потоков на разных ядра/процессорах? Хз, это функция написана в Microsoft, см. minkernel\crts\ucrt\src\appcrt\heap\free_base.cpp @ 112 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 14:39 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
как-то так... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 14:41 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
Cerebrum, а хэндлы блоков у тебя хранятся в общей для всех потоков памяти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 14:45 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
rdb_dev, Там все сложнее, чем простой new/delete, поскольку речь идет не о куске плоской памяти, а об объектах со своей сложной структурой и логикой, в данном случае о CPoolTask, который убивают два раза, после завершения распараллеленного задания в QueryFarm. Данный объект управляется пулом потоков, который и следит за его временем жизни. Само собой, потоки между собой разделяют память, в которой находится данный объект ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 14:58 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
Cerebrumrdb_dev, Там все сложнее, чем простой new/delete, поскольку речь идет не о куске плоской памяти, а об объектах со своей сложной структурой и логикой, в данном случае о CPoolTask, который убивают два раза, после завершения распараллеленного задания в QueryFarm. Данный объект управляется пулом потоков, который и следит за его временем жизни. Само собой, потоки между собой разделяют память, в которой находится данный объектТы не понял моего намёка на барьеры памяти. Используешь boost для обеспечения атомарности при работе с данными в разделяемой между потоками памяти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 15:07 |
|
||
|
Неадекватный дамп
|
|||
|---|---|---|---|
|
#18+
CerebrumИтак, проблему удалось локализовать и воспроизвести на постоянной основе. 100% в Release сборке и иногда в Debug. Окончательного решения пока не найдено, поскольку логика работы приложения намного сложнее, чем я описал в самом начале и пока есть несколько непонятных моментов с гонкой потоков, но не думаю, что это кому-то интересно в рамках поднятого вопроса о корректности стека. На данный момент понятно следующее: - мешанина из классов в стеке не имеет ничего общего с реальной картиной происходящего и связана только с логикой самих отладчиков и проживающих в них тараканах. адекватный у тебя стэк - не ищи того чего нет, как раз вызовы виртуальных функций на удалённом и выделенном объекте, слова ниже это подтверждают CerebrumЯ не берусь утверждать, что это аксиома, но иногда, в сложных случаях, именно windbg показывает более адекватный стек, нежели чем VS. Сам с этим сталкиваюсь не первый раз и только благодаря windbg удается локализовать проблему гораздо быстрее. Поэтому, если у вас есть postmortem дамп, который вы хотите проанализировать, то не ограничивайтесь только запихиванием его в VS, для сравнения также прогоните его в windbg, можете узнать много нового и более точно локализуете проблему. По сравнению с той версией, которую я использовал в начале анализа проблемы, версия из состава Windows SDK 10.0.15063. 400 позволила увидеть более адекватный стек вызовов, хоть с мешаниной из классов, но, по крайней мере, ведущий к действительному месту падения и его причине - повреждению кучи при попытке повторной очистки ранее удаленного объекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2017, 15:08 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39471119&tid=2018143]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
176ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 287ms |

| 0 / 0 |
