简体   繁体   English

GDB:如何将内存地址转换为 STL 对象

[英]GDB: How to cast memory address to STL object

I am analyzing a core dump by using GDB.我正在使用 GDB 分析核心转储。 I know about a memory address that it is pointing to "std::basic_fstream<wchar_t, std::char_traits<wchar_t> >".我知道它指向“std::basic_fstream<wchar_t, std::char_traits<wchar_t> >”的内存地址。

How to cast raw memory address to this template object on GDB prompt?如何在 GDB 提示符下将原始内存地址转换为该模板对象?

I tried by below command:我尝试通过以下命令:

(gdb) p *('std::basic_fstream<wchar_t, std::char_traits<wchar_t> >' *)0x7fae3800b280 No symbol "std::basic_fstream<wchar_t, std::char_traits<wchar_t> >" in current context. (gdb) p *('std::basic_fstream<wchar_t, std::char_traits<wchar_t> >' *)0x7fae3800b280在当前上下文中没有符号 "std::basic_fstream<wchar_t, std::char_traits<wchar_t> >"。

(gdb) p *(std::basic_fstream<wchar_t, std::char_traits<wchar_t> > *)0x7fae3800b280 A syntax error in expression, near `)0x7fae3800b280'. (gdb) p *(std::basic_fstream<wchar_t, std::char_traits<wchar_t> > *)0x7fae3800b280表达式中的语法错误,靠近`)0x7fae3800b280'。

I tried by below command:我尝试通过以下命令:

Wild guess: do you have set auto-solib-add off in your ~/.gdbinit ?疯狂猜测:您是否在~/.gdbinit set auto-solib-add off

The following example works fine for me:以下示例对我来说很好用:

cat t.cc
#include <fstream>

int main(int argc, char *argv[])
{
  std::wfstream s("/dev/tty", s.out);
  for (int j = 0; j < argc; j++)
    s << j << " " << argv[j] << std::endl;
  return 0;
}

g++ -g t.cc && gdb -q ./a.out

(gdb) b 8
Breakpoint 1 at 0x1235: file t.cc, line 8.
(gdb) run foo
Starting program: /tmp/a.out foo
0 /tmp/a.out
1 foo

Breakpoint 1, main (argc=2, argv=0x7fffffffdc28) at t.cc:8
8         return 0;
(gdb) set print static off

(gdb) p s
$1 = {<std::basic_iostream<wchar_t, std::char_traits<wchar_t> >> = {<std::basic_istream<wchar_t, std::char_traits<wchar_t> >> = {<std::basic_ios<wchar_t, std::char_traits<wchar_t> >> = ...

(gdb) p &s
$2 = (std::wfstream *) 0x7fffffffd900

(gdb) p *('std::basic_fstream<wchar_t, std::char_traits<wchar_t> >' *)0x7fffffffd900
$3 = {<std::basic_iostream<wchar_t, std::char_traits<wchar_t> >> = {<std::basic_istream<wchar_t, std::char_traits<wchar_t> >> = {<std::basic_ios<wchar_t, std::char_traits<wchar_t> >> = {<std::ios_base> = ...

You should try to replicate above output.您应该尝试复制上述输出。

If you can reproduce it, your tools are working as expected, and you need to concentrate on how you are analyzing the core dump.如果您可以重现它,那么您的工具就会按预期工作,您需要专注于如何分析core转储。

If above example doesn't work as expected, you have some part of the toolchain which is misbehaving or misconfigured.如果上面的示例没有按预期工作,则您的工具链的某些部分行为不当或配置错误。

One way I was able to achieve No symbol result is by setting auto-solib-add off :我能够实现No symbol结果的一种方法是设置auto-solib-add off

gdb -q ./a.out
Reading symbols from ./a.out...

(gdb) b 8
Breakpoint 1 at 0x1235: file t.cc, line 8.
(gdb) set auto-solib-add off
(gdb) run
Starting program: /tmp/a.out
0 /tmp/a.out

Breakpoint 1, main (argc=1, argv=0x7fffffffdc28) at t.cc:8
8         return 0;

(gdb) p &s
$1 = (std::wfstream *) 0x7fffffffd900

(gdb) p *('std::basic_fstream<wchar_t, std::char_traits<wchar_t> >' *) 0x7fffffffd900
No symbol "std::basic_fstream<wchar_t, std::char_traits<wchar_t> >" in current context.

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM