2012-05-03 4 views
7

У меня есть многоуровневое программное обеспечение, которое представляет собой два приложения (GUI, DataSnap Server). В моем серверном приложении DataSnap возникает причина ошибки EAccessViolation в несколько раз. таких как:Как получить полный стек вызовов в приложении сервера Delphi

Exception EAccessViolation in module unidac160.bpl at 00010CB1. 
Access Violation at 002B77832 in module unidac160.bpl. Read of address 0000000C 

Я хочу получить полный стек вызовов и зарегистрировать его в файле. также я использую eurekalog, но он эффективен только для приложения gui.

ответ

9

EurekaLog чрезвычайно эффективен для всех применений. Просто настройте его так, чтобы он регистрировал исключения в файле и вообще не отображал диалоговые окна.

+6

+1, но «эффективный» не совсем корректен, больше похож на «чрезвычайно эффективный» (: – ComputerSaysNo

+1

Исправлено, как вы предположили :) – Harriv

0

Я использую MemCheck перед тем, чтобы сделать стеки вызовов, но я не уверен, что по-прежнему работает с последними версиями Delphi.

7

В нашем Open-Source logging classes есть перехватчик исключений с полным стеком вызовов, включая строки исходного кода.

Информация об отладке сильно сжата (лучше, чем zip или любые другие форматы), необязательно в exe.

Open Source работает с Delphi 5 до XE2.

В последней версии (используйте один из the source code repository, то есть 1,16), он также может регистрировать исключения внутри библиотек (т. Е. Внутри .dll или .bpl), поскольку ваш запрос явно указывается.

Существуют и другие функции, такие как профилирование на стороне клиента, которые могут помочь вашей поддержке и усовершенствованиям приложений от реальных данных (не только в тестовых стендах).

+0

Wow Arnaud! Ваши вещи просто становятся все лучше и лучше! – lkessler

+0

Если вы порекомендуете его как решение, было бы неплохо иметь хотя бы минимальный пример кода, как добавить/активировать такой перехватчик исключений и т. Д. Для специализированных библиотек достаточно обычно добавлять блок в проект, но не в этом случае Я полагаю. Сжатие MAP-файла происходит с ошибкой в ​​файле 36Mb (некоторый внутренний буфер фиксированного размера слишком мал, он должен быть рассчитан, вероятно, из файла). –

+0

@AndreiGalatyn Проблема с огромным файлом .map была исправлена ​​вчера. И вы можете найти образцы по адресу https://github.com/synopse/mORMot/tree/master/SQLite3/Samples/11%20-%20Exception%20logging –