![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Откуда вызывается процедура? [D7, Win2k, WinXP]
Black-Grin © (2004-09-28 01:12:00)Приветствую, подскажите, как можно получить название процедуры или функции в теле которой находится вызов к "МОЕЙ" процедуре? Тобишь откуда выполняется процедура? Ситуация просто такая, что не могу выловить глюк хочю в лог файл писать действия клиента... а рассовывать процедуру с разными параметрави типа logevent('Пошёл тудато'); Неохота... проще просто logevent... или чтонить типа logevent(nameofprocedure)... Заранее благодарен за дельные советы!
Ruslan Solovyev (2004-09-28 15:09:00) [1]из опций компиляции вверху важная только
-GD
Ruslan Solovyev (2004-09-28 15:07:00) [2]1) Скомпилируй MakeJclDbg из
jcl\examples\debugextension\tools\
2) компилируешь свой код вот так:
%DCCPATH%dcc32 -UJcl -IJCL -$R+ -$C- -$J+ -GD -B -Q myproject.dpr
if not exist myproject.map goto cleanup
rem attach MAP file to executable to trace error/exception stack
Jcl\MakeJclDbg.exe -E myproject.map
del myproject.map
:cleanup
etc
извиняйте - нету времени - дальше сам разберешся :)
удачи
Black-Grin (2004-09-28 11:33:00) [3]Скачать - скачал уже, а вот как ею пользоваться... я то понял что в юсесе нужно указать вышеприведёный юнит но что дальше? Заранее спасибо!
KSergey (2004-09-28 11:08:00) [4]Не в хелпе, в инете надо рыться ;) Она бесплатная
Black-Grin (2004-09-28 11:05:00) [5]Да действительно, без делфей... а вот по поводу JCL можно поподробнее? Я сейчас конечно попробую в хелпе порыться на эту тему но времени мало ;(
Ruslan Solovyev (2004-09-28 10:57:00) [6]Насколькоя понял - Black-Grin хочет получить информацию на клиенте програмно, т.е. без Delphi IDE.
Defunct (2004-09-28 10:21:00) [7]> Alt+Ctrl+S
век живи - век учись...
Ruslan Solovyev (2004-09-28 10:01:00) [8]Можно использовать JCL (JclDebug.pas): файл мэппинга сохраняется в ресурсах и библиотека может оттрасировать стек вызовов со ссылкой на номера строк и имен процедур
KSergey (2004-09-28 09:39:00) [9]
> Black-Grin © (28.09.04 01:12)
Jedi
Говорят там есть что-то, на основе отладочной информации
> [1] Defunct © (28.09.04 03:38)
> Самый простой способ - поставить в вашей процедуре точку
> останова под отладкой, и потом пошагово выйти из процедуры,
> окажетесь там где надо.
Подчеркнутое - не нужно. Достаточно нажать Alt+Ctrl+S
Defunct (2004-09-28 09:22:00) [10]atruhin © (28.09.04 08:18) [3]
?
без разницы там тип передачи параметров
atruhin (2004-09-28 08:18:00) [11]Defunct © (28.09.04 03:48) [2]
Да? А про тип передачи параметров забыл?
Defunct (2004-09-28 03:48:00) [12]Если есть локальные переменные тогда так:
Procedure TForm1.MyProc;
Var CallerAddress: Integer;
{ тут ваши переменные }
Begin
Asm
Push EAx
Mov EAx, [EBp+4]
Mov CallerAddress,EAx
Pop EAx
End;
ShowMessage(Format('caller address %X',[CallerAddress]));
{ здесь ваш код }
End;
Defunct (2004-09-28 03:38:00) [13]> название процедуры или функции в теле которой находится вызов к "МОЕЙ" процедуре?
Никак. Если вы сами туда явно не вставите имя, тогда никак. Можно только получить адрес. И то это довольно сложно сделать. Зависит от количества параметров и от количества локальных переменных в вашей процедуре.
Если нет на входе никаких параметров, и нет локальных переменных тогда так:
Function CalledFrom:Integer;assembler;
Asm
Mov EAx, [ESP]
End;
procedure TForm1.Button5Click(Sender: TObject);
begin
ShowMessage(Format('called from %X',[CalledFrom]));
end;
> Тобишь откуда выполняется процедура?
Самый простой способ - поставить в вашей процедуре точку останова под отладкой, и потом пошагово выйти из процедуры, окажетесь там где надо.