Я исследую дамп, вызванный следующим фрагментом кода:
shared_ptr<Type_Definition> entry = function_result();
if (entry != nullptr) {
if (launch_other_function(entry, value, timestamp)) { // <= here it crashes
...
При помещении трех переменных в окно наблюдения (курсор на строку сбоя) я вижу:
- действительные значения для
timestamp
и value
- для
entry
: Cannot obtain value of the local variable or argument because it is not available at this instruction pointer, possibly because it has been optimized away.
Я считаю, что function_result()
дает нулевой указатель и что проверка null-pointer
для entry
не может его распознать, пропускает и, следовательно, приводит к нарушению доступа (для вашей информации, сообщения об исключении Access violation executing location 0x00000000.
).
У меня вопрос не такой: как я могу проверить нулевой указатель (я знаю, что это можно сделать с помощью if (entry)
), но: я прав, что эта проверка может разрешить ±nullish shared pointer
(извините, я не не знаете, как это правильно сформулировать) чтобы пройти условие?
У кого-нибудь есть идея?
Для вашей информации: настоящим декларация launch_other_function()
:
bool launch_other_function(const shared_ptr<Type_Definition>& entry, double value, DATE timestamp){
...
}
В окне Разборка я вижу следующие строки кода (надеюсь, это имеет смысл):
0127AA32 85 C0 test eax,eax
0127AA34 0F 84 3C 01 00 00 je 0127AB76
0127AA3A 8B 8D 9C FE FF FF mov ecx,dword ptr [ebp-164h]
0127AA40 FF 15 E4 AF 31 00 call dword ptr ds:[31AFE4h]
0127AA46 85 C0 test eax,eax
0127AA48 0F 84 AC 00 00 00 je 0127AAFA
0127AA4E 8B 85 9C FE FF FF mov eax,dword ptr [ebp-164h]
0127AA54 8B B8 80 00 00 00 mov edi,dword ptr [eax+80h]
0127AA5A DD 45 0C fld qword ptr [ebp+0Ch]
0127AA5D 83 EC 08 sub esp,8
0127AA60 DD 1C 24 fstp qword ptr [esp]
0127AA63 C7 85 8C FE FF FF 78 15 4C 00 mov dword ptr [ebp-174h],4C1578h
0127AA6D 89 A5 90 FE FF FF mov dword ptr [ebp-170h],esp
0127AA73 C7 85 94 FE FF FF 87 AA 27 01 mov dword ptr [ebp-16Ch],127AA87h
0127AA7D C6 46 08 00 mov byte ptr [esi+8],0
0127AA81 FF 15 74 17 4C 00 call dword ptr ds:[4C1774h]
0127AA87 83 C4 08 add esp,8
0127AA8A C6 46 08 01 mov byte ptr [esi+8],1
0127AA8E 83 3D 40 D0 01 69 00 cmp dword ptr ds:[6901D040h],0
0127AA95 74 09 je 0127AAA0
0127AA97 50 push eax
0127AA98 52 push edx
0127AA99 E8 82 D9 8B 67 call 68B38420
0127AA9E 5A pop edx
0127AA9F 58 pop eax
О, я забыл: программа действительно многопоточная.
О добавлении отладочной информации, боюсь, добавить нечего, как видно из следующего отрывка вкладки modules
(в обоих случаях (я думаю, что управлял собственным кодом) символы уже загружены) ):
<Product_Name>.exe <Product_Name>.exe C:\<Product_Name>.exe N/A Yes Symbols loaded. C:\Dump_Analyse\<Product_Name>.pdb\5BEA8C97EB644ED2B06B9AFE450EF23E1\<Product_Name>.pdb 2 9.05.1638.3292 25/10/2017 15:02 01050000-011DC000 <Product_Name>.exe_180423_041510.dmp
<Product_Name>.exe <Product_Name>.exe C:\<Product_Name>.exe Yes No Symbols loaded. C:\Dump_Analyse\<Product_Name>.pdb\5BEA8C97EB644ED2B06B9AFE450EF23E1\<Product_Name>.pdb 14 9.05.1638.3292 25/10/2017 15:02 01050000-011DC000 <Product_Name>.exe_180423_041510.dmp [1] <Product_Name>.exe
Заранее спасибо