2013-06-10 3 views
2

У меня есть приложение POS, написанное на Delphi, которое работает до сих пор.Нарушение доступа (Delphi) - за исключением первого прогона

Мне пришлось добавить клиента webservice, чтобы иметь документы, проверенные правительством, и хотя я никогда раньше не работал с WebServices/Encryption, мне это удалось (благодаря интернету действительно).

Когда я запускаю программу и создаю один из этих документов, она отлично проверяется (к веб-сервису обращаются, конверт SOAP с некоторыми данными отправляется, и ответ с сервера получен без каких-либо проблем).

Проблема в том, что если я создаю другой документ, когда я пытаюсь его проверить, я получаю сообщение об ошибке «Нарушение доступа на 0x07e7bcb5: чтение адреса 0x00000012».

Моя процедура проверки является функцией внутри DLL. До того, как он был внутри DLL, у меня был весь код внутри основного проекта, но он разбил мою программу: если бы я проверил документ, ответ пришел бы, но я бы получил нарушение доступа, когда я закончил программу, или если я пытался проверить другой. Я также попытался загрузить DLL динамически, поэтому процесс проверки будет «начинать с нуля» при каждом запуске, но это было бесполезно.

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

Любое направление, которое я должен брать?

спасибо! Нуну Picado

EDIT: я, вероятно, следует отметить, что я использую, чтобы получить доступ к веб-сервиса: - THTTPReqResp и Wininet для связи - IXMLDocument для создания SOAP Envelope - LibEay32 для encript некоторые данные, необходимые вебсервис - TZDB, чтобы получить универсальное время от веб-сервера на основе - CAPICOM 2.0 загрузить сертификат, необходимый для общения

+2

Прежде всего, поместите madExcept, EurekaLog или подобное в ваше приложение. Затем собрать трассировку стека, связанную с AV. Затем отлаживайте его. Я вижу, что вы пытались с EurekaLog. Ну, вам нужно продолжать пытаться. –

ответ

4

Я использую EurekaLog на работе, к ошибкам отладки, которые происходят в установках клиента. Вот что вы делаете с информацией, которую EurekaLog дает вам:

Достаточно высоко в отчете должна быть одна трассировка стека для каждого потока в программе. Тот, который сверху, должен быть тем, в котором произошла ошибка. Это почти всегда самое важное в журнале ошибок: он точно сообщает, что происходит, когда было создано исключение.

Найдите место в коде, соответствующем началу трассировки стека. Нарушение прав доступа означает, что где-то ваш код пытался получить доступ (чтение в этом случае) памяти, которая не отображается в адресное пространство вашей программы. Куча ведущих 0s означает, что вы пытаетесь читать со смещением от нулевого указателя. Это почти всегда означает одну из трех вещей: вы пытаетесь прочитать значение объекта, значение которого равно nil, вы пытаетесь вызвать виртуальный метод для объекта, значение которого равно nil, или вы пытаетесь прочитать элемент строки или динамического массива, длина которого равна 0 (и это в настоящее время представлено нулевым указателем).

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

+0

Привет Спасибо за помощь! Я думаю, что я получил сейчас: В подпрограмме я должен подписать строку с открытым ключом, у меня было: 'вар ... ... InBuf, OutBuf, OutBuf64: Array [0. .2047] AnsiChar; ... ... ... FillChar (InBuf, 2048, # 0); // Изменена в FillChar (InBuf [0], 2048, # 0); FillChar (OutBuf, 2048, # 0); // Изменено в FillChar (OutBuf [0], 2048, # 0); FillChar (OutBuf64, 2048, # 0); // Изменено в FillChar (OutBuf64 [0], 2048, # 0); ' С этими изменениями он больше не сбой. Я до сих пор не понимаю, почему это произошло только после первого запуска ... Большое спасибо Nuno Picado – nunopicado

Смежные вопросы