powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Получение значения переменных на всех уровнях стека.
7 сообщений из 7, страница 1 из 1
Получение значения переменных на всех уровнях стека.
    #35520326
CJIECAPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кто-нибудь пользовался запросом %Debugger.Stack:StackVarAtLevel?
У меня никак не получается заставить его выполниться. Также не понял что именно надо отдавать ему в качестве первого параметра.
Идея такая: при возникновении ошибки в приложении фиксировать в специальном хранилище значения всех переменных на всех уровнях стека. Собственно с извлечением переменных и имеется проблема...
...
Рейтинг: 0 / 0
Получение значения переменных на всех уровнях стека.
    #35520988
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда-то писАл нечто подобное, но сохранились лишь обрывки... Давно уже пользуюсь вызовом
Код: plaintext
do BACK^%ETN
Преимущества: можно просматривать подробности ошибки в Портале, при этом структура глобала ^ERRORS достаточно очевидна для написания собственного просмотрщика (если вдруг надо). Думаю, с анализа исходников ^%ETN и стоит начать, если ваять нечто свое на эту тему...
...
Рейтинг: 0 / 0
Получение значения переменных на всех уровнях стека.
    #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
Получение значения переменных на всех уровнях стека.
    #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
Получение значения переменных на всех уровнях стека.
    #35524214
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zer gut. Однако, не зря исходная утилита все складывает в глобал: если оперативка (partition space for the process) заполнена под завязку, едва ли вы сможете сделать дамп в локальную переменную...
...
Рейтинг: 0 / 0
Получение значения переменных на всех уровнях стека.
    #35524427
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В данном случае, начиная с версии 5.2, наверное, лучше подойдет использование Process-Private Globals
...
Рейтинг: 0 / 0
Получение значения переменных на всех уровнях стека.
    #35524562
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно, хотя не стоит ожидать от них слишком многого: это ведь те же временные глобалы, они точно так же хранятся в БД cachetemp, просто стираются при завершении процесса.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Получение значения переменных на всех уровнях стека.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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