AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX Blogs
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.10.2013, 17:03   #1  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5813 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
А теперь запустите ваш код, дергающий xSession::xppCallStack(), в IL - и обломитесь...
За это сообщение автора поблагодарили: Stitch_MS (1), S.Kuskov (3).
Старый 02.10.2013, 19:45   #2  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от gl00mie Посмотреть сообщение
А теперь запустите ваш код, дергающий xSession::xppCallStack(), в IL - и обломитесь...
Можно галочку убрать )
Старый 03.10.2013, 12:24   #3  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от gl00mie Посмотреть сообщение
А теперь запустите ваш код, дергающий xSession::xppCallStack(), в IL - и обломитесь...
http://letmebingthatforyou.com/?q=ge...20trace%20c%23
За это сообщение автора поблагодарили: trud (1), S.Kuskov (3).
Старый 23.11.2015, 11:01   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,984 / 3273 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от gl00mie Посмотреть сообщение
А теперь запустите ваш код, дергающий xSession::xppCallStack(), в IL - и обломитесь...
Как-то некрасиво x++ себя ведет в этой ситуации.
Попробовал набросать метод замену. Расположил в классе Session.

X++:
/// <summary>
/// Splits the given String by the specified separator and returns the contents in a container.
/// GRD_Stuff_pkoz, Перенос "наработок" из 2009-й, pkoz, 22.11.2015
/// </summary>
/// <param name="_value">
/// The String value to be split.
/// </param>
/// <param name="_sep">
/// The separator.
/// </param>
/// <param name="_convertNumericToInt64">
/// A Boolean value that indicates whether to convert the value to an <c>int64</c> value; optional.
/// </param>
/// <param name="_unpackLineNumber">
/// A Boolean value that indicates whether to extract line number from stacktrace string _value; optional.
/// </param>
/// <returns>
/// A container, which has the String split by the specified separator.
/// </returns>
/// <remarks>
/// In the <paramref name="_convertNumericToInt64" /> parameter, a value of true indicates the returned
/// contents will be converted to an <c>int64</c> value if they only have numeric characters.A value of
/// false indicates that the returned values will not be converted to an <c>int64</c> value and String
/// values will always be returned. The default value of the <paramref name="_convertNumericToInt64" />
/// parameter is true.
/// </remarks>
static container stackLine2con(str _value, str 10 _sep = ',', boolean _convertNumericToInt64 = true, boolean _unpackLineNumber = false)
{
    int         length = strLen(_value);
    int         separatorLength = strLen(_sep);
    int         i = 1;
    int         j = strScan(_value, _sep, 1, length);
    container   ret;
    void add2Ret(str _current)
    {
        if (_convertNumericToInt64 && (match('<:d+>', _current)))
        {
            ret += str2int64(_current);
        }
        else
        {
            ret += _current;
        }

        //GRD_Stuff_pkoz, Перенос "наработок" из 2009-й, pkoz, 22.11.2015 -->
        if ( _unpackLineNumber )
        {
            ret += 0; // пока не реализовано
        }
        else
        {
            ret += 0;
        }
        //GRD_Stuff_pkoz, Перенос "наработок" из 2009-й, pkoz, 22.11.2015 <--
    }

    while (j)
    {
        add2Ret(subStr(_value, i, j-i));
        i = j + separatorLength;
        j = strScan(_value, _sep, i, length);
    }
    add2Ret(subStr(_value, i, length-i+1));
    return ret;
}


/// </param>
/// <param name="_mode">
/// An Int value that indicates how to convert the value to container; optional.
/// </param>
/// <returns>
/// A container, which has the stack trace.
/// </returns>
/// <remarks>
///
/// </remarks>
client server public static container xppILCallStack(int _mode = 0)
{
    str         stack;
    container   ret;
    // int         startPos;
    #define.delimiter("   at ")
    ;
    if (!xSession::isCLRSession())
        return xSession::xppCallStack();
    new InteropPermission(InteropKind::ClrInterop).assert();
    stack = System.Environment::get_StackTrace();
    // startPos = strScan(stack, #delimiter, 1, 1000);
    switch (_mode)
    {
        case 0 : // режим, похожий на обычный xSession::xppCallStack() только извлечение номеров строк не сделано
                ret = [
                        (isRunningOnServer() ? "(S)" : "(C)") + "(CIL)", _mode
                      ] +
                      Session::stackLine2con(stack, #delimiter, false, false);
                break;
        case 1 : // быстрый режим, чтобы не тратить процессорное время на обработку строк. Использующий код в дальнейшем сам обработает как надо - распакует и.т.п. А скорее всего просто проигнорирует.
                ret = [
                        (isRunningOnServer() ? "(S)" : "(C)") + "(CIL)", _mode
                      ] +
                      [stack, 0];
                break;
    }

    return ret;

}
А потом подумалось - возможно это велосипед и я просто не нашел нужного кода в стандарте.

Кто как решает проблему получения стека вызовов при исполнении в p-code и CIL ?

Последний раз редактировалось Logger; 23.11.2015 в 12:40. Причина: исправил ошибки
За это сообщение автора поблагодарили: Ace of Database (5).
Теги
callstack, debug, debug code, debug managed code, mfp, stack trace, законченный пример, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
mfp: X++ Debugging Tips and Tricks Blog bot DAX Blogs 2 24.09.2013 13:01
mfp: X++ Debugging Tips and Tricks #1 – Breakpoint in Info.add() Blog bot DAX Blogs 1 24.09.2013 11:00
sumitax: EP Debugging Tips and Tricks –Part III Blog bot DAX Blogs 0 13.10.2010 14:05
sumitax: EP Debugging Tips and Tricks –Part II Blog bot DAX Blogs 0 30.09.2010 09:05
sumitax: EP Debugging Tips and Tricks –Part I Blog bot DAX Blogs 0 13.08.2010 21:06

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:22.