Отладчик VS2010 не работает на статическом std :: forward_list, есть ли обходной путь? - PullRequest
0 голосов
/ 02 марта 2012

При статическом std :: forward_list отладчик показывает только 1-й элемент.

Нестатический std :: forward_list или статический std :: list работает нормально.

Есть ли какая-нибудь работа в отладчике, который я мог бы использовать?

#include "stdafx.h"
#include <forward_list>
#include <list>

int _tmain(int argc, _TCHAR* argv[])
{
    static std::forward_list<int> sfl;
    sfl.push_front( 1 ); 
    sfl.push_front( 2 );

    std::forward_list<int> fl;
    fl.push_front( 1 ); 
    fl.push_front( 2 );

    static std::list<int> sl;
    sl.push_front( 1 ); 
    sl.push_front( 2 );

    //Break here.
    //In a debugger watch window:
    //  'sfl' only shows the '2' element
    //  'fl' & 'sl' shows all elements.
    return 0;
}

1 Ответ

0 голосов
/ 08 марта 2012

Я считаю, что это ошибка в визуализаторе отладчика Visual Studio.Самое близкое решение, которое я нашел, - это изменить запись forward_list в autoexp.dat (обычно находится в %VSINSTALLDIR%\Common7\Packages\Debugger\)

В файле должен быть раздел со следующим:

;------------------------------------------------------------------------------
;  std::forward_list from <forward_list>
;------------------------------------------------------------------------------
std::forward_list<*>{
    preview (
        #(
            "(",
            #list(
                head: $e._Myhead,
                next: _Next
            ) : $e._Myval,
            ")"
        )
    )

    children (
        #list(
            head: $e._Myhead,
            next: _Next
        ) : $e._Myval
    )
}

Заменить на:

;------------------------------------------------------------------------------
;  std::forward_list from <forward_list>
;------------------------------------------------------------------------------
std::forward_list<*>{
    preview (
        #(
            "(",
            #(
                $e._Myhead->_Myval,
                ",",
                #list(
                    head: $e._Myhead->_Next,
                    next: _Next
                ) : $e._Myval,
            ),
            ")"
        )
    )

    children (
        #(
            [actual 0]: $e._Myhead->_Myval,
            #list(
                head: $e._Myhead->_Next,
                next: _Next
            ) : $e._Myval
        )
    )
}

Это не отличное решение.Дочерние элементы отображаются как [actual 0], [0], [1], ..., а не [0], [1], [2], ..., т. Е. Элемент x помечен [x-1].

Однако вы можете изменить autoexp.dat, не закрывая Visual Studio, вам просто нужно перезапустить отладчик,Поэтому я бы порекомендовал использовать этот хак столько, сколько вам нужно для отладки конкретной проблемы, а затем вернуться к исходному autoexp.dat.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...