C++ 从共享库打印类型为的变量
我有一个程序,它使用外部共享库中的一些方法和类型。我想用gdb分析二进制文件。一切正常。我可以单步执行程序并打印变量。但是,如果我想打印在共享库的头文件中定义的结构,我会得到以下消息C++ 从共享库打印类型为的变量,c++,gdb,C++,Gdb,我有一个程序,它使用外部共享库中的一些方法和类型。我想用gdb分析二进制文件。一切正常。我可以单步执行程序并打印变量。但是,如果我想打印在共享库的头文件中定义的结构,我会得到以下消息 No symbol "_t_TYPE" in current context. 打印层次结构 (gdb) print vType $3 = (TYPE) 0x7fffe75e69d0 (gdb) print (TYPE) 0x7fffe75e69d0 $4 = (_t_TYPE *) 0x7fffe75e69d0
No symbol "_t_TYPE" in current context.
打印层次结构
(gdb) print vType
$3 = (TYPE) 0x7fffe75e69d0
(gdb) print (TYPE) 0x7fffe75e69d0
$4 = (_t_TYPE *) 0x7fffe75e69d0
(gdb) print (_t_TYPE *) 0x7fffe75e69d0
No symbol "_t_TYPE" in current context.
我无法编译带有调试标志或没有优化的库
我知道文件被剥离了。file library.so的结果是:
库:ELF 64位LSB共享对象,x86-64,版本1 SYSV,动态链接,BuildID[sha1]=3f26c595cb3a940260bb82dfa7ec60094db4928c,已剥离
是否有打印结构的方法?有两种情况需要考虑: 结构X的类型是公开的,但您的程序不使用。 该类型是不透明的,对库是私有的。 在第一种情况下,您可以在程序中的某个地方使用struct X类型的变量,或者使用中的技术使struct X的定义可供GDB使用 在第二种情况下,库的开发人员确实不希望您窥探他们的私有实现细节。唯一可以做到这一点的方法是通过库中的反向工程代码。如果您这样做,请注意,即使在库的小更新中,实现也可能发生更改,因为这是私有的实现细节,更改它不会影响库的文档化API或ABI
头文件并没有真正的帮助。类型定义结构_t_类型*类型
是:这是隐藏实现的常用技术。否。如果可能,应该获取头文件的副本,或者使用反汇编工具了解它的外观。头文件没有真正的帮助。类型定义结构_t_类型*类型;定义在另一个文件中。我的意思是定义结构的文件不必是头文件。我只是假设。