Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  21:19[Войти] | [Зарегистрироваться]
Ответ на вопрос № 64008

22-07-2008 07:30
Привет.

Есть Assert в Dll с которой exe общается через интерфесы.
Почему Assert в DLL под отладчиком работает как надо, а без него (под ОС) срабатывает как тихое исключение (Abort) - и ничего не пишет и не выводит.
В exe ассерт работает правильно.

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


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

16-05-2009 13:09 | Комментарий к предыдущим ответам
»вопрос КС №22432« »вопрос КС №38723«

22-07-2008 21:59
Вопрос не рассчитан  на гадание и сходу его не решишь

Гадать тут нечего и решать тоже нечего, все уже давно решено. DLL тут абсолютно ни при чем. Запустите свой поток в EXE и получите то-же самое поведение. Так-же ничего не изменит замена Assert на любое другое исключение.

Вам уже объяснили, как обрабатываются исключения в доп. потоках, и что никакое исключение в доп. потоке не будет само сабой показано.

Работает корректно:
...
3.Если вызван в dll НЕ в основном потоке, под отладчиком

Работат как Abort (не показывая сообщения)

1. Если вызван в другом потоке в DLL (под OS только)


Уберите в опциях отладчика птицу Stop on Delphi Exceptions и будет у Вас все одинаково.

22-07-2008 11:47 | Комментарий к предыдущим ответам
Да ну? EAssertionFailed - это не исключение, что-ли?


Вы не поняли. Не в этом плане. Это относится к
Если вы ждёте, что при этом будет показано какое-либо сообщение, то вам это нужно сделать руками (Exception),
Поэтому я попросил вас отличать исключение от ассерта.


Поэтому: не могли бы вы всё же привести код;

Все совершенно стандартное.
Создается DLL, создаем стандартный поток.
В нем вызываем Assert (False) - больше ничего.

где у вас стоит обработка исключений и показ сообщений и т.п.
Нет там ничего кроме строки Assert(false) .


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



22-07-2008 09:25
>>> Не путайте исключения и ассерты пожалуйста.
Да ну? EAssertionFailed - это не исключение, что-ли?

Не могли бы вы всё же дать больше информации?

Посмотрите на Assert:

procedure _Assert(const Message, Filename: AnsiString; LineNumber: Integer);
begin
  if Assigned(AssertErrorProc) then
    AssertErrorProc(Message, Filename, LineNumber, Pointer(-1))
  else
    Error(reAssertionFailed);  // loses return address
end;



Т.е. он просто вызывает AssertErrorProc, который равен (вы ведь используете SysUtils?):

procedure AssertErrorHandler(const Message, Filename: string;
  LineNumber: Integer; ErrorAddr: Pointer);
var
  E: Exception;
begin
  E := CreateAssertException(Message, Filename, LineNumber);
  RaiseAssertException(E, ErrorAddr, PChar(@ErrorAddr)+4);
end;



Который просто создаёт исключение. Причём EAssertionFailed не относится к тихим исключениям.

Отсюда следует, что если подключен SysUtils и Assert-ы включены, то любой неудачный Assert приводит к возникновению исключения вне зависимости от того, находится ли он в DLL или в EXE. И уж тем более, от того, в каком потоке вызывается.

Поэтому: не могли бы вы всё же привести код; рассказать, как создаёте поток; не находится ли код потока в отдельном модуле; что у вас с опциями проекта (Assertions) и не стоят ли эти директивы в коде; как вы определили, что Assert там вообще есть и он срабатывает; где у вас стоит обработка исключений и показ сообщений и т.п. Ну поверьте же, что здесь не телепаты сидят.

P.S.
>>> Кстати в вашем примере две ошибки. :)
Если вы про Synchronize, то - да, согласен, нужно было это указать. Поленился. Просто хотел подтолкнуть вас к тому, чтобы вы излагали больше информации.

22-07-2008 09:08 | Комментарий к предыдущим ответам
Кстати в вашем примере две ошибки. :)
Одна серьезная.

22-07-2008 09:06 | Комментарий к предыдущим ответам
Можете подробнее описать, что вы делаете, что при этом происходит, и, в частности, чего вы ожидаете.

Я просто вызываю Assert(false) - для проверки.

Если я запускаю программу из под отладчика, - ассерт отображается в виде диалога, т.е. как и положено.
Если же запускаю с под ОС - тогда он работает как Abort (Silent exception) - не отображая сообщение.

Еще раз:

Работает корректно:
1.Если вызван в exe (OS и отладчик)
2.Если вызван в dll но в основном потоке. (OS и отладчик)
3.Если вызван в dll НЕ в основном потоке, под отладчиком.

Работат как Abort (не показывая сообщения)

1. Если вызван в другом потоке в DLL (под OS только)



Если вы ждёте, что при этом будет показано какое-либо сообщение, то вам это нужно сделать руками,

Я это прекрасно знаю. Не путайте исключения и ассерты пожалуйста.

22-07-2008 08:10
Предварительно: любое исключение в потоке приводит к его остановке. Если используется TThread, то исключение помещается в свойство FatalException. Если вы ждёте, что при этом будет показано какое-либо сообщение, то вам это нужно сделать руками, например:

procedure TMyThread.Execute;
begin
  try
    ...
  except
    on E: Exception do
    begin
      ShowMessage(E.Message);
    end;
  end;
end;



Не путайте возможность отладчика показывать предварительное уведомление об исключении с реальной раскруткой и обработкой ошибок в программе.

22-07-2008 08:08 | Вопрос к автору: запрос дополнительной информации
Можете подробнее описать, что вы делаете, что при этом происходит, и, в частности, чего вы ожидаете.

22-07-2008 08:04 | Сообщение от автора вопроса
Еще момент, в dll создается поток.
Если вызвать ассерт в основном потоке в dll, то все ок, иначе работает как Abort.

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Кто съел Красную шапочку?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования