GDB报告错误的地址在c ++对象的构造函数中的参数 [英] GDB reports wrong address for parameter in c++ object's constructor

查看:1014
本文介绍了GDB报告错误的地址在c ++对象的构造函数中的参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到了一个奇怪的行为,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's npos 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 to 0xffffd748, the address that str 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆