Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Получить стэк вызова методов (число прочтений - 5140 )
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Получить стэк вызова методов
08. Сентября 2008 :: 06:35
Печать  
можно сейчас как нибудь получить стэк вызовов который произошел до момента вызова текущего метода

что имеется виду

имеем
Цитата:
class test1 = test1.txt{
Undefine УниверсальныйВызов(...);
}

class test2 = test2.txt : test1{
  void Вызов();
}


класс test1
Код
Выбрать все
Функция УниверсальныйВызов() Экспорт
     Возврат "а здесь хочется узнать какой метод меня вызвал";
КонецФукции
 



класс test2
Код
Выбрать все
Процедура Вызов() Экспорт
     Сообщить(""+я().УниверсальныйВызов());
КонецПроцедуры
 



очень хочется понять имя класса и имя метода которые вызвали метод УниверсальныйВызов() класса test1
этакий стэк вызовов (по крайней мере предыдущий метод)


PS я конечно понимаю что можно передавать явными параметрами, как то так
Цитата:
class test1 = test1.txt{
Undefine УниверсальныйВызов(Строка имяВызова, Строка имяМетодаВызова, ...);
}


- но а вдруг можно как то в общем виде
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Получить стэк вызова методов
Ответ #1 - 08. Сентября 2008 :: 08:52
Печать  
Кури переменные препроцессора Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Получить стэк вызова методов
Ответ #2 - 08. Сентября 2008 :: 10:29
Печать  
artbear писал(а) 08. Сентября 2008 :: 08:52:
Кури переменные препроцессора Улыбка


это вот эти видимо
Цитата:
//#exinfo
данная директива может быть использована только в модулях реализации КОП. Директива выводит информацию пользователю о месте вызова метода, в котором она расположена, и строку кода, который осуществил вызов метода. В основном используется в отладочных целях.

//#curmeth
директива выводит на экран текущий исполняемый метод класса и его параметры с актуальными значениями и типами в месте появления данной директивы. Примечание: в Defcls.prm данная директива отключена.


я их уже нашел, они с окном сообщений работают

эх.....мне бы программно получить/обработать/отослать  Нерешительный Печаль
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Получить стэк вызова методов
Ответ #3 - 08. Сентября 2008 :: 11:34
Печать  
Напомни, exinfo выдает только один метод или все-таки стек ?
Пиши в багзиллу, подумаю.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Получить стэк вызова методов
Ответ #4 - 08. Сентября 2008 :: 12:09
Печать  
Цитата:
Пиши в багзиллу, подумаю.

Баг/Предложение зарегистрировал
http://www.1cpp.ru/bugs/show_bug.cgi?id=4138

Цитата:
Напомни, exinfo выдает только один метод или все-таки

Код
Выбрать все
//#exinfo - выводит строку модуля произведшую текущий вызов в формате
<СтрокаМодуля>
{<ИмяМодуля>(<НомерСтрокиМодуля>)} 



так что вообщем то не стек наверное

PS я там еще один неприятный момент обнаружил с наследником и родителем
PSS кстати версия которую я беру для тестирования - icp-latest
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Получить стэк вызова методов
Ответ #5 - 08. Сентября 2008 :: 12:33
Печать  
Ответил по наследнику в багзилле.

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

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Получить стэк вызова методов
Ответ #6 - 08. Сентября 2008 :: 17:16
Печать  
Так нам же для отладки, Артур, только для отладки! Обещаем не использовать фичу неканоническим способом Очень довольный

Вот разбираю я алгоритм формирования выгрузки из ЗиК в Бух... Алгоритм там тот ещё Печаль
И вот, к примеру, есть там некая функция, которая может вызываться большую кучу раз, из разных мест, в том числе, естественно, и разных уровней вложенности и прочее, и прочее... И вот, из 100 её вызовов есть 5, которые меня интересуют. Раскиданы они по этой сотне разнообразно, и, возможно, не все из них произошли из одной точки.
Можно, конечно, сделать условную точку останова и глазами посмотреть стек вызовов всех пяти событий... И если хочется их сравнить - то каждый стек записать..
А так было бы клёво (читай: ускорило бы мою работу) - вывалить стек каждого вызова куда-нибудь и потом анализировать спокойно всю эту инфу.

ЗЫ: Хотя, конечно, понятно - у людей разные способы отладки, не стану настаивать, что мой способ лучший (или даже просто - хорош). Лично я пользуюсь отладчиком только в очень крайних случаях. В остальном - для меня Сообщить(), тз.ВыбратьСтроку(), сп.ВыбратьЗначение() - рулят.
  
Наверх
ICQ  
IP записан
 
Donat
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 152
Зарегистрирован: 29. Мая 2006
Re: Получить стэк вызова методов
Ответ #7 - 08. Сентября 2008 :: 17:37
Печать  
Да, эта возможность была-бы востребованна многими.
  
Наверх
 
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Получить стэк вызова методов
Ответ #8 - 09. Сентября 2008 :: 12:05
Печать  
по аналогии я сейчас посмотрел в java

там есть такая хрень как Enviroment и Runtime

у Runtime есть парочка методов
traceInstructions(true/false)
traceMethodCalls(true/false)


это дает возможность производить трасировку средствами jvm

после этого можно получить в любом месте
получить коллекцию классов
StackTraceElement(declaringClass, methodName, fileName, lineNumber)


могу конечно ошибиться - пока еще не исследовал это вопрос до конца

PS а вообще то стэк вызовов у нас получить можно наверное
таким образом
Улыбка
Цитата:
функция ПолучитьСтэкВызовов()
  Перем коллекцияВызовов;
  Попытка  
     а = 0;
     а = а/0;
  Исключение
     строкаСтэка = ОписаниеОшибки();
     ///остается только распарсить строку для
     ///добавления в коллекцию
  КонецПопытки
  возврат коллекцияВызовов;
конецФункции


Изменено:
всё намного хуже
чтобы получить строку стэка вызовов которая образуется
в окне сообщений
необходимо всю последовательность вызова методов
облечь в попытку/исключение

что в принципе логично  Улыбка
но обидно  Нерешительный


  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать