Оглавление
Инициализация insiderTools
API для фатальных ошибок
API для стека вызовов
Расширенная
информация об использованной памяти
Инициализация insiderTools
Специальной
инициализации для InsiderTools не требуется.
Если вы хотите использовать обработчик фатальных ошибок, вставьте эту строку где-нибудь в начале программы:
insider():installHandlers() |
API
для фатальных ошибок
Это
API выводит обработку исключений и фатальных ошибок на профессиональный
уровень.
В отличии от стандартного xppfatal.log,
в файл выводится вся возможная инфомация. еще
о файле>
::installHandlers()
инициализация
обработчика фатальных ошибок
::setErrorPath(pathName) ->
oldPath
установка
пути для хранения файлов с фатальными ошибками. По умолчанию, это
папка с главным .exe файлом.
::setErrorName(fileName) ->
oldName
установка
имени для файла фатальных ошибок.
По умолчанию, "xppCrash.log"
API
для стека вызовов
::procParamA(nCallStack,nThreadId)
-> paramsArr
возвращает
параметры функции из стека вызовов в виде массива
::procParam(nCallStack,nIndex,nThreadId)
-> paramValue
возвращает
конкретный параметр функции из стека вызовов
::procParamCount(nCallStack,nThreadId)
-> numParams
возвращает
количество параметров
у функции из стека вызовов
::procBlock(nCallStack,nThreadId)
-> codeblock|NIL
возвращает
действительный блок кода для вызова блока кода
::procObject(nCallStack,nThreadId)
-> object|NIL
возвращает
действительный объект для вызова метода
|
пример
вывода стека вызовов |
|
Local
i
..
Local args
Local block
Local object
..
//этот цикл взят из стандартного ErrorSys.prg
i
:= nStackStart
DO WHILE ! Empty( ProcName(++i) )
? EHS_CALLED_FROM, Trim( ProcName(i) ) + "(" +
;
LTrim( Str( ProcLine(i) ) ) + ")"
//эти строки выводят дополнительную информацию
//об элементе стека вызовов
args:=
insider():procParamA(i)
block:=
insider():procBlock(i)
object:=
insider():procObject(i)
If block!=NIL
?" block="+Var2Char(block)
End
If object!=NIL
?" object="+Var2Char(object)
End
If Len(args)>0
?" args="+Var2Char(args)
End
ENDDO
?
|
Расширенная
информация об использованной памяти (класс XppMemoryInfo)
Язык программирования
Xbase++ объектно-ориентированный, не типизированный, с поддержкой
многопоточности. Эти возможности неизбежно влекут сложную внутреннюю
организацию среды запуска языка.
Мы попытались привести в порядок наше знание о недокументированных структурах
и выделили наиболее интересную информацию в
специальный класс XppMemoryInfo().
Чтобы получить
информацию о памяти, вызовите insider():getMemorySnapshot().
Этот вызов возвращает объект типа XppMemoryInfo.
Переменные уровня языка Xbase++
::varStat
статистика
об использованных переменных, сгруппированная по типу и виду доступа.
Эта переменная содержит массив массивов по два элемента на каждый
тип. Первый элемент это количество использованных переменных такого
типа, а второй это количество ссылок на переменные такого типа.
Типы расположены в ::varStat в порядке ABCDLMNOU.
|
пример |
|
//вывод
использованных типов переменных
types:="ABCDLMNOU"
With insider():getMemorySnapshot()
a:=:::varStat
For i:=1 To Len(types)
?types[i]+"=",a[i,1],"
(+",a[i,2],"ссылок)"
Next
EndWith |
::objects
содержит
список использованных объектов, сгруппированных по классам. Первый
элемент это имя класса, второй -- количество использованных объектов
этого класса.
|
пример |
|
//вывод
использованных объектов
With insider():getMemorySnapshot()
a:=:::objects
For i:=1 To Len(a)
?"имя
класса=",a[i,1],"
кол-во=",a[i,2]
Next
EndWith |
::variables
содержит
общее количество использованных переменных языка Xbase++. ВНИМАНИЕ:
ссылки не входят, так же сюда не входят простые типы хранящиеся в
массивах или объектах.
::inArrays
на уровне
реализации, массивы хранят свое значение в отдельной области памяти.
Эта переменная является количеством элементов всех использованных
массивов.
::inObjects
как и
массивы, объекты хранят свои переменные в отдельной области памяти.
Эта переменная является количеством переменных
во всех использованных
объектах.
Переменные уровня реализации (внутренняя информация)
::allocedMemory
общий
размер (включая свободное место) таблицы momHandles. Эта таблица
хранит значения всех переменных. Чтобы посчитать размер использованной
памяти, вычтите ::freeMemory из этой переменной.
::freeMemory
размер
свободной памяти в таблице momHandles.
::totalMomObjs
общее
количество momObj, специальных структур, обрабатываемых сборщиком
мусора. Чаще всего,
momObj является ссылкой на переменную языка Xbase++.
Например, при вызове функций _con*() из C-Api,
ContainerHandle указывает на некоторую структуру momObj.
::freeMomObjs
количесво
свободных momObj.
Другие функции
insider():getVarRefs(var) ->
nRefCount
возвращает
количество ссылок на проверяемую переменную. Этот вызов имеет значение
только для массивов и объектов.
|
пример |
|
//проверим
количество ссылок на arr
arr:={1}
holdArr:={arr,arr,arr}
? insider():getVarRefs(arr)
//выводит 4, т.е. arr сам
//плюс 3 ссылки в holdArr |
©2006
Eleus Software
|