Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не срабатывает breakpoint, В одной из программ. 
:(
    Опции темы
CodeMonkey
Дата 26.11.2008, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



В другой версии Delphi не пробовали?
Попробуйте поставить бряк руками:
Код
procedure TForm5.FormCreate(Sender: TObject);
begin
  asm
    int 3
  end;
  ...

Что будет?

Добавлено через 1 минуту и 23 секунды
...и попробуйте ещё включить Use Debug DCU, сделать Build и повторить свой эксперимент с F7 под отладчиком.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
LamerTM
Дата 26.11.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 11.3.2006

Репутация: нет
Всего: 0



Цитата(CodeMonkey @ 26.11.2008,  11:14)
В другой версии Delphi не пробовали?
Попробуйте поставить бряк руками:
Код
procedure TForm5.FormCreate(Sender: TObject);
begin
  asm
    int 3
  end;
  ...

Что будет?

Добавлено @ 11:15
...и попробуйте ещё включить Use Debug DCU, сделать Build и повторить свой эксперимент с F7 под отладчиком.

В другой версии Delphi не пробовал.


Поставил asm int 3 end в FormCreate. Результат: остановка программы; полоска дебагера в какой-то левой процедуре модуля unit5. При нажатии F7 получается AccessViolation.



Потом проект перезагрузил (чтобы убрать изменения). Включил Debug DCU's. Поставил бряк в файл .dpr на команду Application.CreateForm(TForm5, Form5);
Запустил прогу по F9. Бряк сработал. 
Нажал F7. Попал в модуль Forms в процедуру:

procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);

Стал нажимать F8 и F7. Дошел до места вызова FormCreate. Попал в левую процедуру unit5 (ту же самую, куда попадал когда ставил asm int 3 end). Уже в этой левой процедуре нажал F7. Попал в процедуру MessageDlg (хотя команда была совсем другая на экране написана. Но первая строка в FormCreate была вызовом MessageDlg). Короче, на экране нарисовано одно, а выполняется другое. Потом после MessageDlg опять AccessViolation случился.


Если переставлять процедуры в unit5, то синие точки появляются начиная с разных мест. Что-то мне это стало надоедать уже. smile У меня есть старая версия проги, там всё нормально, и я сейчас потихоньку ее переделаю в новую. Но с причиной все равно было бы интересно разобраться.
PM MAIL   Вверх
CodeMonkey
Дата 26.11.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



А большой проект? Может выложите? Для интересу.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
LamerTM
Дата 26.11.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 11.3.2006

Репутация: нет
Всего: 0



Цитата(CodeMonkey @ 26.11.2008,  12:18)
А большой проект? Может выложите? Для интересу.

К сожалению выложить не могу.
PM MAIL   Вверх
LamerTM
Дата 26.11.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 11.3.2006

Репутация: нет
Всего: 0



Цитата(CodeMonkey @ 26.11.2008,  10:10)
3. Проверьте ещё вот это: IDE.Delphi.Отладка.Неправильная нумерация строк.

Написал небольшую прогу чтобы она прошлась по исходнику в поисках 0D без 0A. Не нашла.
PM MAIL   Вверх
CodeMonkey
Дата 26.11.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(LamerTM @  26.11.2008,  11:59 Найти цитируемый пост)
Поставил asm int 3 end в FormCreate. Результат: остановка программы; полоска дебагера в какой-то левой процедуре модуля unit5


Цитата(LamerTM @  26.11.2008,  11:59 Найти цитируемый пост)
Но первая строка в FormCreate была вызовом MessageDlg). Короче, на экране нарисовано одно, а выполняется другое.


А можно тогда скрин?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Bose
Дата 26.11.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Цитата(LamerTM @  26.11.2008,  11:59 Найти цитируемый пост)
Короче, на экране нарисовано одно, а выполняется другое. Потом после MessageDlg опять AccessViolation случился.


У меня было что-то похожее, когда в программе было много извращений с {$IFDEF} {$ENDIF} и часть кода была вынесена в included файлы. 
PM MAIL WWW Skype   Вверх
LamerTM
Дата 26.11.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 11.3.2006

Репутация: нет
Всего: 0



Цитата(CodeMonkey @ 26.11.2008,  13:27)
Цитата(LamerTM @  26.11.2008,  11:59 Найти цитируемый пост)
Поставил asm int 3 end в FormCreate. Результат: остановка программы; полоска дебагера в какой-то левой процедуре модуля unit5


Цитата(LamerTM @  26.11.2008,  11:59 Найти цитируемый пост)
Но первая строка в FormCreate была вызовом MessageDlg). Короче, на экране нарисовано одно, а выполняется другое.


А можно тогда скрин?

Если в FormCreate поставить 'asm int 3 end' вот так (картинка сразу после build project):

user posted image

То при старте приложения по F9 дебагер останавливается в этом месте:

user posted image

Эта процедура в реальности не выполняется.
PM MAIL   Вверх
CodeMonkey
Дата 26.11.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Реально странная загадка.
Если это не проблема с DCU, то я даже и не знаю.
А CPU отладчиком умеете пользоваться? Может посмотреть куда идёт CALL из TApplication.CreateForm? И сравнить его с указателем на TForm5.FormCreate.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
LamerTM
Дата 26.11.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 11.3.2006

Репутация: нет
Всего: 0



Цитата(CodeMonkey @ 26.11.2008,  15:17)
Реально странная загадка.
Если это не проблема с DCU, то я даже и не знаю.
А CPU отладчиком умеете пользоваться? Может посмотреть куда идёт CALL из TApplication.CreateForm? И сравнить его с указателем на TForm5.FormCreate.

CPU я не очень умею пользоваться. Но попробую.

В процедуру TForm5.FormCreate поставил вызов MessageDlg. Вот так:

user posted image

Потом сделал как и раньше: бряк на Application.CreateForm в модуле .dpr
Запустил по F9. Бряк сработал. Включил CPU Window. И стал нажимать F7 и F8. Пока не дошел до TForm5.FormCreate.
Скрин CPU в этот момент (я тут уже немного вперед прошел):

user posted image

Видно, что асмовский код соответствует паскалевскому коду FormCreate. А строки паскалевские из левой процедуры. В окне паскалевского исходника полоска дебагера тоже в левой процедуре. При трассировке CPU выполняется код FormCreate (вызывается MessageDlg и т.д. Без ошибок всё). При этом полоска дебагера (что в code editor, где паскалевский исходник) скачет черт знает где по исходнику, только не там где реально выполняется программа.
PM MAIL   Вверх
CodeMonkey
Дата 26.11.2008, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



А если вызвать AOF_L2 по F7 (хотя бы в том же TForm5.FormCreate, вместо диалога), то что покажет CPU-отладчик?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
LamerTM
Дата 26.11.2008, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 11.3.2006

Репутация: нет
Всего: 0



Цитата(CodeMonkey @ 26.11.2008,  17:27)
А если вызвать AOF_L2 по F7 (хотя бы в том же TForm5.FormCreate, вместо диалога), то что покажет CPU-отладчик?

А её нельзя вызвать напрямую. Она объявлена внутри другой процедуры. Думаю, если извратиться и вызвать, то полоска дебагера окажется в какой-нибудь другой процедуре. smile А CPU отладчик покажет тоже что-то подобное, по аналогии.

Это сообщение отредактировал(а) LamerTM - 26.11.2008, 17:34
PM MAIL   Вверх
CodeMonkey
Дата 26.11.2008, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(LamerTM @  26.11.2008,  17:34 Найти цитируемый пост)
Думаю, если извратиться и вызвать

Мож попробуем извратиться? smile  Сделать все процедуры глобальными или хотя бы указатели на них вытащить на глобальный уровень. Больно охота докопаться до сути, а ничего больше в голову не приходит.

Кстати, если просто по-процедурно перетащить код из Unit5 в новый Unit5 ничего не меняется?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
LamerTM
Дата 26.11.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 11.3.2006

Репутация: нет
Всего: 0



Цитата(CodeMonkey @ 26.11.2008,  17:43)
Цитата(LamerTM @  26.11.2008,  17:34 Найти цитируемый пост)
Думаю, если извратиться и вызвать

Мож попробуем извратиться? smile  Сделать все процедуры глобальными или хотя бы указатели на них вытащить на глобальный уровень. Больно охота докопаться до сути, а ничего больше в голову не приходит.

А смысл? Я сейчас AOF_L2 передвинул вниз по тексту. Стало останавливаться в другой процедуре, но в том же месте (раньше останавливалось на строке 8648 исходника, и теперь на 8648, только процедура там теперь другая).


Цитата

Кстати, если просто по-процедурно перетащить код из Unit5 в новый Unit5 ничего не меняется?

Если открыть глючный Unit5 в блокноте, нажать Ctrl+A, потом Ctrl+C. Потом в Delphi открыть старую версию проекта (с безглючным Unit5), выбрать Unit5, нажать Ctrl+A, потом Ctrl+V. Потом сделать Build Project , то получаются всё те же глюки (то есть нет синих точек в начале текста, не работают брейки и т.д.).

Насчет перетаскивать по-процедурно - сейчас этим и займусь. Буду в старую версию перетаскивать из новой глючной версии только новые процедуры. И смотреть на какой из них заглючит весь модуль. smile

Добавлено @ 18:03
Цитата(Bose @ 26.11.2008,  13:54)
У меня было что-то похожее, когда в программе было много извращений с {$IFDEF} {$ENDIF} и часть кода была вынесена в included файлы.

У меня в проблемном Unit5 нет ни одного IFDEF. В других модулях есть, но мало.


Цитата

Сделать все процедуры глобальными или хотя бы указатели на них вытащить на глобальный уровень. 

Интересно, а как можно вытащить указатель на процедуру на глобальный уровень? Это потом даст возможность вызывать локальные процедуры?

Это сообщение отредактировал(а) LamerTM - 26.11.2008, 18:07
PM MAIL   Вверх
CodeMonkey
Дата 26.11.2008, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(LamerTM @  26.11.2008,  18:01 Найти цитируемый пост)
Интересно, а как можно вытащить указатель на процедуру на глобальный уровень? Это потом даст возможность вызывать локальные процедуры?

Не очень красиво (и совершенно идейно неправильно), но можно как-то так:
Код
var
  P: procedure;

procedure DoSomething;

  procedure MyInternalProc;
  begin
    ...
  end;

begin
  if not Assigned(P) then
  begin
    P := @MyInternalProc;
    Exit;
  end;
  ...
end;

...

initialization
  DoSomething; // только заполнение P, без работы


См. также: http://forum.sources.ru/index.php?showtopic=248820

Цитата(LamerTM @  26.11.2008,  18:01 Найти цитируемый пост)
А смысл?

А вот интересно, если код FormCreate IDE считает за код AOF_L2, то за что будет она считать код самой AOF_L2? По типу, это какой-то странный сдвиг строк вдруг произошёл или ещё что-то...

Добавлено через 1 минуту и 11 секунд
А какой размер в строках/байтах имеет этот модуль?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0867 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.