GDB报告错误的地址在c ++对象的构造函数中的参数 [英] GDB reports wrong address for parameter in c++ object's constructor
问题描述
我遇到了一个奇怪的行为,GDB传递一个字符串作为参数到构造函数。
代码工作正常,但是当我在调试器中浏览时,GDB似乎认为我的参数在不同的地址。有没有人知道这里发生了什么?
I'm experiencing a weird behavior with GDB passing a string as the parameter to a constructor. The code works fine, but when I step through in the debugger, GDB seems to think my parameter is at a different address then it is. Does anyone know what's going on here?
这是我可以创建的最简单的程序,演示了这个问题:
Here's the simplest program I can create that demonstrates the problem:
--(jwcacces@neptune)--------------------------------------------(/home/jwcacces)--
--$ nl gdb_weird.cpp
1 #include <iostream>
2 #include <string>
3
4 class C
5 {
6 public:
7 C(std::string str)
8 {
9 std::string* str_ptr = &str;
10 std::cout << "Address of str: " << &str << std::endl;
11 std::cout << "Address in str_ptr: " << str_ptr << std::endl;
12 std::cout << "Value of str: " << str << std::endl;
13 };
14 };
15
16 int main(int, char*[])
17 {
18 std::string s("Hello, World!");
19 C c(s);
20 return 0;
21 }
编译调试信息,无需优化。
注意,当我编译为x86,x64和mingw(x86)时,我看到这个问题。
我没有尝试其他架构。
Compile with debugging info, no optimization.
Note, that I see this problem when compiled for x86, x64, and mingw(x86).
I have not tried other architectures.
--(jwcacces@neptune)--------------------------------------------(/home/jwcacces)--
--$ g++ -O0 -g -Wall -Wextra gdb_weird.cpp -m32
--(jwcacces@neptune)--------------------------------------------(/home/jwcacces)--
--$ g++ --version
g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
现在,调试:
--(jwcacces@neptune)--------------------------------------------(/home/jwcacces)--
--$ gdb a.out
GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/jwcacces/a.out...done.
(gdb) br main
Breakpoint 1 at 0x80488ce: file gdb_weird.cpp, line 18.
(gdb) run
Starting program: /home/jwcacces/a.out
Breakpoint 1, main () at gdb_weird.cpp:18
18 std::string s("Hello, World!");
(gdb) next
19 C c(s);
(gdb) step
C::C (this=0xffffd74f, str=...) at gdb_weird.cpp:9
9 std::string* str_ptr = &str;
这是奇怪,当我尝试输出 str
,我得到垃圾:
Here's the weirdness, when I try to output str
, I get garbage:
(gdb) output str
{
static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>},
<No data fields>},
_M_p = 0xffffd748 "\024\260\004\b\364\177\354\367\360\211\004\b\364\177\354", <incomplete sequence \367>
}
}
那么,GDB认为 str
是?
(gdb) output &str
(std::string *) 0xffffd734
程序认为 str
是?
(gdb) next
10 std::cout << "Address of str: " << &str << std::endl;
(gdb) next
Address of str: 0xffffd748
11 std::cout << "Address in str_ptr: " << str_ptr << std::endl;
(gdb) next
Address in str_ptr: 0xffffd748
12 std::cout << "Value of str: " << str << std::endl;
这真的很奇怪,程序认为 str
0xffffd748
,但gdb认为它在 0xffffd734
当您输出 0xffffd748
,它可以正常工作。
This is really strange, the program thinks str
is at 0xffffd748
, but gdb thinks its at 0xffffd734
And, when you output the string object that would be at 0xffffd748
it works correctly.
(gdb) output *(std::string*)0xffffd748
{
static npos = <optimized out>,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>},
<No data fields>
},
_M_p = 0x804b014 "Hello, World!"
}
}
程序本身没有问题,使用参数:
And the program itself hs no problem using the parameter:
(gdb) next
Value of str: Hello, World!
13 };
(gdb) continue
Continuing.
[Inferior 1 (process 19463) exited normally]
(gdb) quit
我试过将constructor参数的类型改为int,struct,指针,但我不能重现古怪。
此外,我试图将调试格式设置为-ggdb。
I have tried changing the type of the constructor parameter to an int, a struct, a pointer, but I can not reproduce the weirdness.
Also, I have tried setting the debugging format to -ggdb.
问题:
- 这是怎么回事?
- 为什么gdb说
std :: string
的npos
- 这只是一个巧合,在对象中,GDB认为
str
,_M_p
成员指向0xffffd748
c $ c> str 实际上位于? - 在这种情况下还会发生什么其他情况?
- What's going on here?
- Why does gdb say that
std::string
'snpos
member is optimized out (optimized out of library maybe), and does that have anything to do with it? - Is it just a coincidence that in the "object" that would be where GDB thinks
str
is, the_M_p
member points to0xffffd748
, the address thatstr
actually is located at? - In what other circumstances with this behavior happen?
---- WOAH,突破----
如果我将调试格式设置为-gstabs +,GDB将获取 str
right。
这是否意味着gdb调试格式无法正常工作?
---- WOAH, Breakthrough ----
If I set the debugging format to -gstabs+, GDB gets the address of str
right.
Does this mean that the gdb debugging format does not work correctly?
推荐答案
从任何帖子( https://gcc.gnu.org) /ml/gcc/2001-04/msg01037.html )在调试C ++时,似乎-gstabs或-gstabs +是正确的标志。我希望这可以帮助。
From any post (https://gcc.gnu.org/ml/gcc/2001-04/msg01037.html) it seems that -gstabs or -gstabs+ are the correct flags when debugging C++. I hope this can help.
这篇关于GDB报告错误的地址在c ++对象的构造函数中的参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!