VS2010调试器在静态std :: forward_list上失败,任何解决方法?

时间:2012-03-02 14:34:53

标签: visual-studio-2010 debugging stl

使用静态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 :(得分:0)

我相信这是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]

但是,您可以在不关闭Visual Studio的情况下修改autoexp.dat,只需重新启动调试器即可。因此,只要您需要调试特定问题,我就建议您使用此hack,然后恢复原始autoexp.dat