Подскажите по EurekaLog

Kovryga

Турист
C помощью чего все же локально лучше отслеживать утечку памяти в проекте FastMM или EL (D7)?
Сама проблема возникает не постоянно: после компиляции и закрытии приложения
 

JCDenton

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

Во-вторых, любой трейсер исключений предназначен для сбора отчёта на машинах пользователя. Это означает, что в трейсерах исключений используются "достаточно быстрые" методы, чтобы не слишком замедлять работу программы - в отличие от любых локальных инструментов, которые могут использовать мощные и медленные средства отладки на машине разработчика.

Нахрена локально использовать трейсер, если есть отладчик?

Добавлено через 2 минуты
он видит это как утечку
Я сильно сомневаюсь, что фильтр к менеджеру памяти способен генерировать ложные сообщения об утечках. Скорее всего, утечка всё же была.
 
Last edited by a moderator:

eflc

Турист
У меня с EurekaLog было не мало проблем, хотя 3 года более менее работало. После перехода на madExcept всё решилось.
 

ForumReader

Турист
Эврика слишком монструозная. Превратилась из полезной утилиты в огромный комплекс задач, не связанный с изначальной целью, как мне кажется.
madExcept в этом плане гораздо оптимальнее.
 

SQRTLY

Турист
Да, ты правильно понимаешь, что если у тебя в коде вызывается исключение через Raise Exception.Create, то EurekaLog, если он подключен, может перехватить это исключение и показать окно с предложением отправить отчет разработчику. Это стандартное поведение для инструментов вроде EurekaLog, которые предназначены для сбора информации об ошибках.

Если ты хочешь, чтобы в данном конкретном случае пользователь видел сообщение об ошибке без участия EurekaLog, то можно поступить несколькими способами:

  1. Использовать обычное сообщение вместо исключения:
    Вместо того чтобы вызывать исключение, можно просто показать пользователю сообщение об ошибке через ShowMessage или аналогичную функцию. Например:
    pascal
    Copy
    if Error then
    ShowMessage('Вы допустили ошибку');
    В этом случае исключение не будет вызвано, и EurekaLog не сработает.
  2. Использовать собственный тип исключения:
    Если ты хочешь оставить исключения, но при этом не всегда использовать EurekaLog, можно создать собственный тип исключения и обрабатывать его отдельно. Например:
    pascal
    Copy
    type
    TUserException = class(Exception);

    if Error then
    Raise TUserException.Create('Вы допустили ошибку');
    Затем в коде можно обрабатывать такие исключения отдельно, показывая пользователю сообщение, а другие исключения оставлять для EurekaLog.
  3. Настроить EurekaLog:
    EurekaLog позволяет настраивать, какие исключения нужно перехватывать, а какие нет. Можно добавить фильтр, чтобы исключения определенного типа (например, TUserException) не обрабатывались EurekaLog. Это делается через настройки EurekaLog.
  4. Обрабатывать исключения вручную:
    Можно вручную перехватывать исключения в коде и решать, что с ними делать. Например:
    pascal
    Copy
    try
    if Error then
    Raise Exception.Create('Вы допустили ошибку');
    except
    on E: Exception do
    begin
    ShowMessage(E.Message); // Показываем пользователю
    if not (E is TUserException) then
    raise; // Пробрасываем исключение дальше, если это не пользовательская ошибка
    end;
    end;
Так что да, можно обойтись без переделки всего кода на Raise MyException, если правильно настроить обработку исключений или использовать альтернативные подходы.

У меня в приложении некоторые ситуации обрабатываются путем вызова исключений.

Например
Code:
If Error Then
  Raise Exception.Create('Вы допустили ошибку');
Правильно я понимаю, что в этом случае EurekaLog сформирует окно с предложением отправить сообщение разработчику?

Мне бы хотелось, чтобы в данном случае это видел пользователь, без подключения Eureka.

Так можно?

Или везде надо будет переделывать на Raise MyException, а в Eureka ставить исключение?
https://kursfinder.ru/readymag/ тут учился
 
Last edited:

SQRTLY

Турист
Да, ты правильно понимаешь, что если у тебя в коде вызывается исключение через Raise Exception.Create, то EurekaLog, если он подключен, может перехватить это исключение и показать окно с предложением отправить отчет разработчику. Это стандартное поведение для инструментов вроде EurekaLog, которые предназначены для сбора информации об ошибках.

Если ты хочешь, чтобы в данном конкретном случае пользователь видел сообщение об ошибке без участия EurekaLog, то можно поступить несколькими способами:

  1. Использовать обычное сообщение вместо исключения:
    Вместо того чтобы вызывать исключение, можно просто показать пользователю сообщение об ошибке через ShowMessage или аналогичную функцию. Например:
    pascal
    Copy
    if Error then
    ShowMessage('Вы допустили ошибку');
    В этом случае исключение не будет вызвано, и EurekaLog не сработает.
  2. Использовать собственный тип исключения:
    Если ты хочешь оставить исключения, но при этом не всегда использовать EurekaLog, можно создать собственный тип исключения и обрабатывать его отдельно. Например:
    pascal
    Copy
    type
    TUserException = class(Exception);

    if Error then
    Raise TUserException.Create('Вы допустили ошибку');
    Затем в коде можно обрабатывать такие исключения отдельно, показывая пользователю сообщение, а другие исключения оставлять для EurekaLog.
  3. Настроить EurekaLog:
    EurekaLog позволяет настраивать, какие исключения нужно перехватывать, а какие нет. Можно добавить фильтр, чтобы исключения определенного типа (например, TUserException) не обрабатывались EurekaLog. Это делается через настройки EurekaLog.
  4. Обрабатывать исключения вручную:
    Можно вручную перехватывать исключения в коде и решать, что с ними делать. Например:
    pascal
    Copy
    try
    if Error then
    Raise Exception.Create('Вы допустили ошибку');
    except
    on E: Exception do
    begin
    ShowMessage(E.Message); // Показываем пользователю
    if not (E is TUserException) then
    raise; // Пробрасываем исключение дальше, если это не пользовательская ошибка
    end;
    end;
Так что да, можно обойтись без переделки всего кода на Raise MyException, если правильно настроить обработку исключений или использовать альтернативные подходы.
 
Top