Visual Studio Express 2010 C ++ Разборка Отладка - PullRequest
2 голосов
/ 14 февраля 2012

У меня есть программа на C ++, которая вылетает при нарушении прав доступа, когда я запускаю ее в отладчике с Visual Studio. Проблема в том, что в прошлом это обычно приводило меня к линии, где это происходило, но для этой проблемы говорилось, что источник недоступен, и приводило меня к разборке. Я понятия не имею, как расшифровать это и получить любую полезную информацию. Это приводит меня к следующей строке:

0000000057A93F0F  cmp         dword ptr [rcx+11BCh],0  

Тогда, если я запустлю его снова, он остановится на:

0000000058673F0F  cmp         dword ptr [rcx+11BCh],0  

Затем, если я запускаю его снова, он останавливается на первом, а затем снова на втором, если я снова запускаю его ... он просто продолжает этот цикл. Мне кажется странным, что это происходит по разным адресам поочередно, но опять же, я даже не знаю точно ли это адрес.

Как я могу использовать эту информацию, чтобы найти проблему?

(я бы опубликовал код, но я не представляю, в каком разделе возникает проблема, поэтому не знаю, что писать ... Мне не следует пытаться скомпилировать flash-to-directx с платформой x64).

Спасибо

EDIT

Вот строки перед тем, как произойдет сбой:

0000000057A93EF3  test        dl,1  
0000000057A93EF6  je          0000000057A93EFD  
0000000057A93EF8  call        0000000057FC8024  
0000000057A93EFD  mov         rax,rbx  
0000000057A93F00  add         rsp,20h  
0000000057A93F04  pop         rbx  
0000000057A93F05  ret  
0000000057A93F06  int         3  
0000000057A93F07  int         3  
0000000057A93F08  sub         rsp,28h  
0000000057A93F0C  mov         ecx,r8d  

и затем происходит сбой в:

0000000057A93F0F  cmp         dword ptr [rcx+11BCh],0  

Также последний элемент в моем стеке вызовов:

Flash64_11_1_102.ocx!0000000058673f0f()

Ответы [ 3 ]

2 голосов
/ 15 февраля 2012

Классическое усечение 64-битных указателей в Adobe Flash dll. Возможно, какая-то функция получает DWORD userData вместо void* userData через некоторую структуру и затем преобразует ее в указатель объекта. Это работает нормально в 32-битной среде, но вылетает в 64-битной.

Объяснение

mov         ecx,r8d

Первая операция копирует только младшие 32 бита с R8D на ECX (ECX 32-битный).

cmp         dword ptr [rcx+11BCh],0

Вторая операция осуществляет доступ к 64-битному регистру, где младшие 32 бита содержат правильный адрес, а старшие 32 бита содержат некоторое количество мусора Конечно, это приведет к краху.

Как исправить

Это довольно легко, если вы не против редактировать dll с помощью шестнадцатеричного редактора. Вам понадобится MASM.exe старой школы (вы можете получить его с веб-сайта Microsoft).

Создайте файл .asm или получите его из примеров и измените его с помощью кода, подобного следующему:

nop
nop
nop

mov ecx,r8d
cmp dword ptr [rcx+11BCh],0

nop
nop
nop

mov rcx,r8d   // I've replaced ecx with rcx here
cmp dword ptr [rcx+11BCh],0

Создайте файл .obj, отправив его в MASM. Откройте полученный файл в любом шестнадцатеричном редакторе и обратите внимание на последовательность 90 90 90 first_sequence_of_bytes 90 90 90 second_sequence_of_bytes. Все, что вам нужно сделать, это найти в оригинальной dll первую последовательность байтов и заменить ее второй последовательностью байтов. Я почти уверен, что разница будет только в первом байте.

Это исправит ваш сбой.

0 голосов
/ 14 февраля 2012

Для таких проблем первое, что я делаю, это продвигаюсь как можно дальше в любых шагах, необходимых для воспроизведения проблемы.Как только я как можно ближе, я включаю всю обработку исключений (Ctrl + Alt + E, отметьте все флажки в появившемся диалоговом окне), и воспроизводить сбой.вы должны проникнуть в то место кода, где исключение первого шанса не обработано, и оно должно дать вам хотя бы немного контекста того, что вызывает дамп.

0 голосов
/ 14 февраля 2012

Я не уверен, какие функции есть у Express, но если он позволяет вам просматривать регистры, я готов поспорить, что rcx равен нулю (указатель NULL). Вы также должны иметь возможность посмотреть на стек вызовов. Если это так, вы можете найти свой код в стеке и увидеть, какая функция передает нулевой указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...