【问题标题】:when trying call push_back of std::vector in gdb, got "Attempt to take address of value not located in memory"尝试在 gdb 中调用 std::vector 的 push_back 时,得到“尝试获取不在内存中的值的地址”
【发布时间】:2013-12-02 08:58:00
【问题描述】:

我想在调试程序时通过 gdb 创建和模拟一些 STL 数据。

我在gdb中使用下面的命令来获取std::vector的一块内存,然后设置它的分配器,最后调用“push_back”函数填充一个整数。 但是,gdb 只是在调用 push_back 时向我显示了“尝试获取不在内存中的值的地址。”的消息。

请注意,我已经意识到“push_back”的参数是一个常量引用。因此,我在堆上“ma​​lloc”了一块内存来存储参数。

这是 gdb 调用:

(gdb) set $vect =  ('std::vector<int, std::allocator<int>>'*) malloc (sizeof('std::vector<int, std::allocator<int>>')) 
(gdb) set $alloc = ('std::allocator<int>'*)malloc(sizeof('std::allocator<int>'))
(gdb) set (std::allocator<int>)($vect->_M_impl) = *$alloc
(gdb) set $vect->_M_impl._M_start = 0  
(gdb) set $vect->_M_impl._M_finish = 0
(gdb) set $vect->_M_impl._M_end_of_storage = 0
(gdb) p *$vect
$21 = {<std::_Vector_base<int, std::allocator<int> >> = {
    _M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}}, <No data fields>}
(gdb) set $num = (int*)malloc(sizeof(int))
(gdb) set *$num = 5             
(gdb) p *$num
$22 = 5
(gdb) call $vect->push_back(*$num)
Attempt to take address of value not located in memory.

gdb 版本是 7.6.1。

【问题讨论】:

    标签: stl gdb


    【解决方案1】:

    这只是 gdb 表达式求值器中的一个错误。它在某处的 gdb bugzilla 中(我认为最初使用 std::string 报告了一些测试用例)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-27
      相关资源
      最近更新 更多