【发布时间】:2013-01-26 23:17:21
【问题描述】:
我正在学习使用 gdb 调试器,但是当该向量包含从另一个向量复制的值时,我无法访问该向量的值。最终,下面的程序做了我想做的事情(将“nums”的值复制到一个新的向量“copyOfNums”中),但是当我在“copyNums”中执行第一个 for 循环后尝试检查 copyOfNums[0] 的值时",无法访问内存中的值(请参阅下面的 gdb 会话)。
copy nums下面已经执行了for语句的1个循环,所以copyNums[0]应该包含nums[0]指向的值的地址还是应该包含一个新int的引用(与nums[0]) 指向的 l 值?无论如何,我希望能够访问该值,但正如您从以下 gdb 输出中看到的那样,它是不可访问的。
Breakpoint 1, copyNums (nums=@0x7fff5fbffad0) at main.cpp:10
(gdb) print nums[0]
$1 = (int &) @0x100103910: 2
(gdb) print copyOfNums[0]
$2 = (int &) @0x0: Cannot access memory at address 0x0
(gdb)
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
vector<int> copyNums(vector<int> nums){
int sizeNums = nums.size();
vector<int> copyOfNums;
=>for (int i = 0; i < sizeNums; i++){
copyOfNums.push_back(nums[i]);
}
return copyOfNums;
}
vector<int> getSmallNums(){
vector<int> nums;
nums.push_back(2);
nums.push_back(1);
nums.push_back(8);
return nums;
}
int main (int argc, char *argv[]){
vector<int> nums = getSmallNums();
vector<int> copyOfNums = copyNums(nums);
return 0;
}
这是 sort 返回后的 gbd 输出。看起来副本包含对内存中新位置的引用,其左值为 2(如预期的那样)。为什么我无法在函数 copyNums 中访问 copyOfNums[0]?
(gdb) print nums[0]
$3 = (int &) @0x1001000e0: 2
(gdb) print copyOfNums[0]
$4 = (int &) @0x100103920: 2
编辑:这是调试会话的更完整图片
(gdb) info locals
i = 1
sizeNums = 3
copyOfNums = {
<std::_Vector_base<int,std::allocator<int> >> = {
_M_impl = {
<std::allocator<int>> = {
<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>},
members of std::_Vector_base<int,std::allocator<int> >::_Vector_impl:
_M_start = 0x0,
_M_finish = 0x0,
_M_end_of_storage = 0x0
}
}, <No data fields>}
(gdb) print copyOfNums[0]
$1 = (const int &) @0x0: Cannot access memory at address 0x0
【问题讨论】:
-
我建议您将
copyNums的声明更改为:vector<int> copyNums(vector<int> const &nums)您的代码将整个整数向量复制到堆栈中,以按值传递,而您只需要传递一个常量引用。 -
计算以
#include <iostream>开头的行号,然后第10行的断点在int sizeNums = nums.size();处停止执行。copyOfNums此时没有元素,你是用gdb next 还是step 进入循环的? -
哎呀,我通过调试会话删除了部分内容,在该会话中,我在初始中断后多次点击“下一个” - 所以此时它已经经历了一次循环迭代。
-
另外,感谢关于将其更改为 const &nums 的建议!
-
您可以尝试使用
-gstab+编译器选项编译它并尝试再次调试它(我在DWARF 2 中遇到过类似问题)?