Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从共享库打印类型为的变量_C++_Gdb - Fatal编程技术网

C++ 从共享库打印类型为的变量

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

我有一个程序,它使用外部共享库中的一些方法和类型。我想用gdb分析二进制文件。一切正常。我可以单步执行程序并打印变量。但是,如果我想打印在共享库的头文件中定义的结构,我会得到以下消息

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_类型*类型;定义在另一个文件中。我的意思是定义结构的文件不必是头文件。我只是假设。