Просмотр полной версии : Увидеть порядок вызова функций
Здравствуйте, овзникла необходимость быстро разобраться в большом количестве чужого кода?
Сначала выбрал схему ити от главного класса по обращению к другим, и так в рекурсии. Но это очень путает и медленно. Есть ли какой то инструмент, помогающий облегчить этот процесс?
К прмиеру при запуске приложения отображает порядок вызова функций. чтобы можно было в интерактивном режиме увидеть что за что отвечает?
там где вам нужно получить цепочку вызовов функций:
trace(new Error().getStackTrace());
#getStackTrace (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/Error.html#getStackTrace())
AlexCooper
25.04.2013, 04:45
там где вам нужно получить цепочку вызовов функций:
trace(new Error().getStackTrace());
#getStackTrace (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/Error.html#getStackTrace())
возьму на заметку)
Тогда уж вот эту возьмите :)
public static function getFunctionName(e:Error):String {
var stackTrace:String = e.getStackTrace(); // entire stack trace
var startIndex:int = stackTrace.indexOf("at ");// start of first line
var endIndex:int = stackTrace.indexOf("()"); // end of function name
var suffixTrace:String=stackTrace.substring(endIndex + 3);
startIndex=suffixTrace.indexOf("at ");
endIndex= suffixTrace.indexOf("()"); // end of function name
suffixTrace=suffixTrace.substring(startIndex + 3, endIndex);
return suffixTrace;
}
getFunctionName(new Error())
Babylon, Вы тестировали сами, то что предлагаете?
Где там цепочка вызовов?
ну то есть понятно, так можно получить имя последней вызывающей функции в стеке.
изначально речь шла о другом немного.
derhab, тестирую постоянно :)
Более того. Написал две обертки для входа ni() и выхода из функции ne()
Где то в базовом классе
....
public static var sp:String;
public static var nsp:int;
.....
public static function dsp():void
{
sp="";
for (var i:uint=0;i<=2*nsp;i++){
sp=sp+" ";
}
}
public static function ni(s:String=""):void
{
if (s!=""){s=" # "+s}
dsp();
trace(sp+"->"+getFunctionName(new Error())+s);
nsp++;
}
public static function ne():void
{
nsp--;
dsp();
trace(sp+"<-"+getFunctionName(new Error()));
if (nsp<0) nsp=0;
}
s - это для параметров которые хотите увидеть в трейсе
derhab, тестирую постоянно :)
Более того. Написал две обертки для входа ni() и выхода из функции ne()
Где то в базовом классе
....
public static var sp:String;
public static var nsp:int;
.....
public static function dsp():void
{
sp="";
for (var i:uint=0;i<=2*nsp;i++){
sp=sp+" ";
}
}
public static function ni(s:String=""):void
{
if (s!=""){s=" # "+s}
dsp();
trace(sp+"->"+getFunctionName(new Error())+s);
nsp++;
}
public static function ne():void
{
nsp--;
dsp();
trace(sp+"<-"+getFunctionName(new Error()));
if (nsp<0) nsp=0;
}
s - это для параметров которые хотите увидеть в трейсе
А можно подробнее, зачем это нужно? И как в релизе вы избавляетесь от этих функций(CONFIG:: DEBUG)?
Вы не поверите у меня и в некоторых релизах они стоят. Ибо через какое-то время - год-два ты не вспомнишь логику работы приложения и тут они в самый раз:)
tsarapkabel
25.04.2013, 16:37
Для проверки написал 3 функции, запускаются так:
Конструктор класса -> goSecondFunction, goSecondFunction запускает таймер, по таймеру вызывается goThirdFunction.
В goThirdFunction вызываю trace(new Error().getStackTrace()), получаю:
Error
at StackTrace/goThirdFunction()[D:\путь к классу\StackTrace.as:46]
at StackTrace/onTimerStartThird()[D:\путь к классу\StackTrace.as:39]
Выходит, работает до 1-го таймера. Если вызвать ещё и из функции, вызывающей таймер, всё ок.
goThirdFunction()
onTimerStartThird()
goSecondFunction()
конструктор()
Используя метод Babylon getFunctionName:
StackTrace/onTimerStartThird
StackTrace
Может я чего недопонял?
tsarapkabel, а что вы ожидали увидеть?
Вызовы надо ставить в каждую функцию которую ты трейсишь
Партизан
26.04.2013, 00:41
Я бы воспользовался дебагером для таких целей. В FD например, очень неплохой. Какие-то пара-другая функций для кое-какого просмотра стека вызовов не заменят полноценного дебагера с брейкпоинтами и localvars например. Не говоря уже о том, что точки останова можно на "горячую" как ставить, так и убирать.
В FD убогий дебаггер. Мне до сих пор не понятно, почему в нем нельзя поставить брекпоинт после запуска программы.
Psycho Tiger
26.04.2013, 12:59
В FD убогий дебаггер. Мне до сих пор не понятно, почему в нем нельзя поставить брекпоинт после запуска программы.
Уже давно можно :)
Вообще, могу порекоммнедовать Идею. Последняя версия (12) стала совсем хороша.
Но, честно, если бы не мак, я бы до сих пор работал в FD и не знал горя.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.