C++ 无效迭代器:第一次使用它时,如何获取一些调试信息?

C++ 无效迭代器:第一次使用它时,如何获取一些调试信息?,c++,gcc,gdb,valgrind,C++,Gcc,Gdb,Valgrind,如果可以从调试器获得更多关于它的信息,这将非常有用。例如,下面的程序 #include <vector> #include <iostream> int main() { std::vector<int> x = {1, 2, 3}; for (std::vector<int>::iterator it = x.begin(); it != x.end(); ++ it) { x.erase(it);

如果可以从调试器获得更多关于它的信息,这将非常有用。例如,下面的程序

#include <vector>
#include <iostream>

int main()
{
    std::vector<int> x = {1, 2, 3};

    for (std::vector<int>::iterator it = x.begin(); it != x.end(); ++ it)
    {
        x.erase(it);
        std::cout << *it << std::endl;
    }
}
#包括
#包括
int main()
{
向量x={1,2,3};
对于(std::vector::iterator it=x.begin();it!=x.end();++it)
{
x、 抹去(它);
标准::cout
如果gdb或valgrind或其他调试方法在第一次使用时可以显示无效的迭代器消息,那就太好了

您可以使用
libstdc++
debug模式(由
-D\u GLIBCXX\u debug
启用)来帮助处理类似的错误。示例:

g++ -std=c++11 -g -D_GLIBCXX_DEBUG t.cc && gdb -q ./a.out

(gdb) r
Starting program: /tmp/a.out
/usr/include/c++/4.8/debug/safe_iterator.h:264:error: attempt to
    dereference a singular iterator.

Objects involved in the operation:
iterator "this" @ 0x0x7fffffffe1d0 {
type = N11__gnu_debug14_Safe_iteratorIN9__gnu_cxx17__normal_iteratorIPiNSt9__cxx19986vectorIiSaIiEEEEENSt7__debug6vectorIiS6_EEEE (mutable iterator);
  state = singular;
  references sequence with type `NSt7__debug6vectorIiSaIiEEE' @ 0x0x7fffffffe1d0
}

Program received signal SIGABRT, Aborted.
0x00007ffff7531cc9 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56  ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  0x00007ffff7531cc9 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1  0x00007ffff75350d8 in __GI_abort () at abort.c:89
#2  0x00007ffff7b85fe5 in __gnu_debug::_Error_formatter::_M_error (this=0x7fffffffdf90) at ../../../../../src/libstdc++-v3/src/c++11/debug.cc:781
#3  0x0000000000402144 in __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, std::__cxx1998::vector<int, std::allocator<int> > >, std::__debug::vector<int, std::allocator<int> > >::operator* (this=0x7fffffffe1d0) at /usr/include/c++/4.8/debug/safe_iterator.h:262
#4  0x000000000040145c in main () at t.cc:11
(gdb) fr 4
#4  0x000000000040145c in main () at t.cc:11
11          std::cout << *it << std::endl;
g++-std=c++11-g-D\u GLIBCXX\u DEBUG t.cc&&gdb-q./a.out
(gdb)r
启动程序:/tmp/a.out
/usr/include/c++/4.8/debug/safe_iterator.h:264:错误:尝试
取消对单个迭代器的引用。
操作中涉及的对象:
迭代器“this”@0x0x7fffffffe1d0{
type=N11\uuuu gnu\u debug14\u Safe\u迭代器9\uu gnu\u cxx17\uuu normal\u迭代器st9\uu CXX19986向量器IIEEenst7\uu debug6向量器6\u EEEE(可变迭代器);
状态=单数;
在0x0x7FFFFFE1D0处引用类型为“NSt7__Debug6Vectorisaiiee”的序列
}
程序收到信号SIGABRT,中止。
0x00007FF7531CC9英寸GI上升(信号=sig@entry=6)at../nptl/sysdeps/unix/sysv/linux/raise.c:56
56../nptl/sysdeps/unix/sysv/linux/raise.c:没有这样的文件或目录。
(gdb)英国电信
#0 0x00007FF7531CC9英寸GI上升(信号=sig@entry=6)at../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1 0x00007FF75350D8 in_uuugi_abort()位于abort.c:89
#2 0x00007FF7B85FE5位于../../../../../../../../src/libstdc++-v3/src/c++11/debug.cc处的格式化程序:错误:错误(this=0x7FFFFFFFFF90)
#在/usr/include/c++/4.8/debug/Safe_迭代器处的3 0x0000000000402144 in_uugnu_调试::_Safe_迭代器::operator*(this=0x7fffffffe1d0)。h:262
#t.cc:11处主管道()中的4 0x000000000040145c
(gdb)fr 4
#t.cc:11处主管道()中的4 0x000000000040145c
11标准::cout