Отладка краша пользователя из сборки

У меня есть программное приложение, о котором некоторые пользователи сообщают, что оно дает сбой в определенных ситуациях. Я не могу воспроизвести это ни на одной из машин, которые у меня есть, поэтому я не знаю, как это решить.

Пользователь опубликовал мне сборочную линию, где происходит сбой, например:

00505e58 1000 adc [eax],al
00505e5a cc int 3
00505e5b cc int 3
00505e5c cc int 3
00505e5d cc int 3
00505e5e cc int 3
00505e5f cc int 3
00505e60 55 push ebp
00505e61 8bec mov ebp,esp
00505e63 83ec1c sub esp,0x1c
FAULT -> 00505e66 ff4f08 dec dword ptr [edi+0x8] ds:0023:00000008=????????
00505e69 53 push ebx
00505e6a 56 push esi
00505e6b 0f85b0000000 jne Construct2+0x105f21 (00505f21)
00505e71 8d9894010000 lea ebx,[eax+0x194]
00505e77 8d45f0 lea eax,[ebp-0x10]
00505e7a 8bcb mov ecx,ebx
00505e7c e8ef4ff1ff call Construct2+0x1ae70 (0041ae70)
00505e81 8d45e4 lea eax,[ebp-0x1c]
00505e84 8bcb mov ecx,ebx
00505e86 e88580fdff call Construct2+0xddf10 (004ddf10)

Я использую Visual Studio 2010, и у меня есть .pdbs для сборки, которую я дал пользователю. Можно ли превратить эту трассировку сборки в ошибочную строку кода?


person AshleysBrain    schedule 16.02.2011    source источник


Ответы (1)


Если бы вы могли получить полный аварийный дамп вашего приложения при его сбое, то вы могли бы запустить dmp либо в windbg, либо в Visual Studio и довольно легко выполнить отладку с помощью исходного кода. В Интернете есть много информации о получении дампа и отладке. Например, если у вас есть дамп и соответствующий pdb, и вы вызываете его в windbg, вы можете просто сделать «.lines» и посмотреть, где именно это происходит.

Если у вас нет дампа, то один из способов сделать это — запустить приложение локально и посмотреть код по этому адресу. Похоже, что ваше приложение, которым, как я полагаю, является Construct2.exe, запускается с базового адреса 0x0040000, а происходит сбой по адресу 0x00505E66, где EDI равен 0. Поэтому, если вы переключитесь на представление дизассемблирования, перейдите по этому адресу (или установите bp), затем посмотрите на источник, и все готово.

person nithins    schedule 16.02.2011
comment
В качестве альтернативы вы можете выполнить двоичный поиск в своей программе, например. для e8 ef 4f f1 ff (или весь код из вашего примера) - person Shelwien; 16.02.2011
comment
Спасибо, виндбг пригодился. - person AshleysBrain; 16.02.2011