Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Получение значения переменных на всех уровнях стека. / 7 сообщений из 7, страница 1 из 1
03.09.2008, 14:10
    #35520326
CJIECAPb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение значения переменных на всех уровнях стека.
Кто-нибудь пользовался запросом %Debugger.Stack:StackVarAtLevel?
У меня никак не получается заставить его выполниться. Также не понял что именно надо отдавать ему в качестве первого параметра.
Идея такая: при возникновении ошибки в приложении фиксировать в специальном хранилище значения всех переменных на всех уровнях стека. Собственно с извлечением переменных и имеется проблема...
...
Рейтинг: 0 / 0
03.09.2008, 17:15
    #35520988
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение значения переменных на всех уровнях стека.
Когда-то писАл нечто подобное, но сохранились лишь обрывки... Давно уже пользуюсь вызовом
Код: plaintext
do BACK^%ETN
Преимущества: можно просматривать подробности ошибки в Портале, при этом структура глобала ^ERRORS достаточно очевидна для написания собственного просмотрщика (если вдруг надо). Думаю, с анализа исходников ^%ETN и стоит начать, если ваять нечто свое на эту тему...
...
Рейтинг: 0 / 0
03.09.2008, 18:57
    #35521224
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение значения переменных на всех уровнях стека.
CJIECAPb... Также не понял что именно надо отдавать ему в качестве первого параметра.
Идея такая: при возникновении ошибки в приложении фиксировать в специальном хранилище значения всех переменных на всех уровнях стека. Собственно с извлечением переменных и имеется проблема...
Как я понял, в %Debugger.Stack:StackVarAtLevel передается DebId:
Код: plaintext
1.
2.
3.
4.
5.
6.
...
  s deb=##class(%Debugger.System).%New()
  d deb.Attach( 8504 )
  s rs=##class(%ResultSet).%New("%Debugger.Stack:StackVarAtLevel")
  s sc=rs.Execute(deb.DebId) 
...
У класса %Debugger.System есть свой метод StackVars .

Можно еще так:
Код: plaintext
1.
2.
3.
4.
5.
6.
...
  s id="myID"
  d debugstack^%STACK(id)
  s reqid=^CacheTemp.SYSDebugger("STACK",id)
  zw ^mtemp(reqid)
...
...
Рейтинг: 0 / 0
05.09.2008, 09:53
    #35523865
CJIECAPb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение значения переменных на всех уровнях стека.
После анализа исходников ^%STACK написал небольшую программку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
StackStorage(VariableName)
 N State S State("Lev")=$ZU( 41 )- 1  ;save the stack level
 D SaveST^%STACK ;save state information into State()
 ;
 S State=$$%msub^%STACK() ;get a temp file pointer
 D StoreST^%STACK ;store State() information into ^mtemp(State)
 D LoadStk^%STACK(State, 0 , 0 ) ;Load into ^mtemp(State,) w/o vars & w/ text
 ;
 S $ZT="Kill^"_$ZN,$ZE=""
 D Show(State) ;interactive display stack information
 M @VariableName=^mtemp(State)
Kill S $ZT="" I $ZE]"" W !,"Error: "_$ZE
 I $G(State) DO  K ^mtemp(State) ;remove *everything* afterwards
 . N X S X=State K State S State=X,X=""
 . F  S X=$O(^mtemp(State,"*STACK", 0 ,"V",X)) Q:X=""  S State(X)=^(X)
 ;
 S $ZT="Error^"_$ZN
 I $D(State) D RestST ;restore state information
 Q
Error S $ZT="" Q
Show(%msub) ;display state information for one temp variable
 N State D LoadVar ;display the process stack as an opener
 Q
LoadVar ;load the variables
 I $G(^mtemp(%msub,"*VARS")) Q  ;already loaded
 DO
 . D LoadStk^%STACK(%msub, 1 , 0 ) ;into %msub, w/ variables & display status
 Q
RestST ;restore state information
 N GLO,IO
 S $ZR=State("$ZR")
 S IO=$G(State("$I")) U IO S $X=State("$X"),$Y=State("$Y")
 S $ZE=State("$ZE") I State("$T") ;set $ZE and $T
 Q

Собственно всё получилось - после выполнения, в переменной, имя которой передан туда как параметр, содержится вся информация о всех уровнях стека, включая дампы переменных и объектов.
...
Рейтинг: 0 / 0
05.09.2008, 11:50
    #35524214
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение значения переменных на всех уровнях стека.
Zer gut. Однако, не зря исходная утилита все складывает в глобал: если оперативка (partition space for the process) заполнена под завязку, едва ли вы сможете сделать дамп в локальную переменную...
...
Рейтинг: 0 / 0
05.09.2008, 12:44
    #35524427
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение значения переменных на всех уровнях стека.
В данном случае, начиная с версии 5.2, наверное, лучше подойдет использование Process-Private Globals
...
Рейтинг: 0 / 0
05.09.2008, 13:29
    #35524562
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение значения переменных на всех уровнях стека.
Возможно, хотя не стоит ожидать от них слишком многого: это ведь те же временные глобалы, они точно так же хранятся в БД cachetemp, просто стираются при завершении процесса.
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Получение значения переменных на всех уровнях стека. / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]