作为一种爱好,我对我最喜欢的游戏的服务器可执行文件进行逆向工程。在这个例子中,我试图调试(和补丁修复)服务器崩溃。我已经在内存中绘制了几个结构,并希望在GDB中干净地检查它们。我的意图是做以下事情(用地址替换ebp,当然,这只是一个说明问题的例子):
print *(UsefulDebug::Structures::StructureOne*)(ebp+8)
在我的共享库的调试信息中定义了UsefulDebug::Structures::StructureOne
。
我尝试重命名我的“调试库”以匹配崩溃时加载的一个共享库对象。这样做时,我发现GDB可以自动完成我的调试信息,但是ptype和任何打印在第二个命名空间后都无法识别它。这是一个实际的例子:
(gdb) ptype NWNXLib
type = namespace NWNXLib
(gdb) ptype NWNXLib::API
type = namespace NWNXLib::API
(gdb) ptype NWNXLib::API::CExoString
No type "API" within class or namespace "NWNXLib"
鉴于以下文件......
server_executable: This is the executable which crashed.
core: This is the core dump produced when the above executable crashed.
useful_shared_library.so: This is an arbitrary file which contains debug information for all of the structures present in the program.
在调试核心转储时,我是否可以使用 useful_shared_library.so 中的调试信息,即使该库与崩溃无关并且当时未加载?可能还有一种更简单的方法来完成我想要做的事情。如果有,我很乐意听到它!
谢谢!