PDA

Просмотр полной версии : Увидеть порядок вызова функций


faraday
25.04.2013, 01:38
Здравствуйте, овзникла необходимость быстро разобраться в большом количестве чужого кода?
Сначала выбрал схему ити от главного класса по обращению к другим, и так в рекурсии. Но это очень путает и медленно. Есть ли какой то инструмент, помогающий облегчить этот процесс?
К прмиеру при запуске приложения отображает порядок вызова функций. чтобы можно было в интерактивном режиме увидеть что за что отвечает?

derhab
25.04.2013, 02:05
там где вам нужно получить цепочку вызовов функций:
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())

возьму на заметку)

Babylon
25.04.2013, 13:19
Тогда уж вот эту возьмите :)
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())

faraday
25.04.2013, 13:29
Спасибо, буду пробовать)

derhab
25.04.2013, 13:39
Babylon, Вы тестировали сами, то что предлагаете?
Где там цепочка вызовов?

ну то есть понятно, так можно получить имя последней вызывающей функции в стеке.
изначально речь шла о другом немного.

Babylon
25.04.2013, 14:42
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 - это для параметров которые хотите увидеть в трейсе

vizgl
25.04.2013, 15:36
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)?

Babylon
25.04.2013, 16:12
Вы не поверите у меня и в некоторых релизах они стоят. Ибо через какое-то время - год-два ты не вспомнишь логику работы приложения и тут они в самый раз:)

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
Может я чего недопонял?

alatar
25.04.2013, 17:17
tsarapkabel, а что вы ожидали увидеть?

Babylon
25.04.2013, 17:22
Вызовы надо ставить в каждую функцию которую ты трейсишь

Партизан
26.04.2013, 00:41
Я бы воспользовался дебагером для таких целей. В FD например, очень неплохой. Какие-то пара-другая функций для кое-какого просмотра стека вызовов не заменят полноценного дебагера с брейкпоинтами и localvars например. Не говоря уже о том, что точки останова можно на "горячую" как ставить, так и убирать.

alatar
26.04.2013, 03:50
В FD убогий дебаггер. Мне до сих пор не понятно, почему в нем нельзя поставить брекпоинт после запуска программы.

Psycho Tiger
26.04.2013, 12:59
В FD убогий дебаггер. Мне до сих пор не понятно, почему в нем нельзя поставить брекпоинт после запуска программы.
Уже давно можно :)
Вообще, могу порекоммнедовать Идею. Последняя версия (12) стала совсем хороша.

Но, честно, если бы не мак, я бы до сих пор работал в FD и не знал горя.