- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
[深呼吸。]我们有一个使用 WxMotif 2.6.3 弹出窗口的应用程序(GUI 库过去不是——现在也不是——我的选择)。它在 32 位 ix86 系统上运行良好。我的任务是将它转换为 64 位应用程序。它总是出现段错误。我在 RHEL 6 上,所以我使用 gcc 4.4.7 编译。在咬牙切齿之后,问题似乎很明显:在 wxFrame::DoCreate 中,m_mainWidget 被设置(正确);在 wxFrame::GetMainWidget 中,它作为空指针返回。空指针导致崩溃。使用gdb,设置m_mainWidget的指令是
mov %rax,0x1e0(%rdx) # $rdx = 0x68b2f0
而获取 m_mainWidget 的代码是
mov 0x1f0(%rax),%rax # $rax = 0x68b2f0
在 gdb 中,我可以检查内存并查看 0x68b4d0 处的指针是正确的。为什么偏移量不正确?
更令人困惑的是,当我使用 objdump 反汇编 libwx_motifd_core-2.6.so.0.3.1 时,“get”程序集是
mov 0x1e0(%rax),%rax
在objdump中,get和set都使用0x1e0作为偏移量。这是怎么回事?
我在这里上传了一些相关信息: GitHub
我已经包含了一个小程序来复制我系统上的问题。
进一步调查,我在 wxFrame::DoCreate 的反汇编中看到,m_mainWidget 的进一步使用使用 0x1e0 作为偏移量检索值(反汇编是在我使用 -O0 的编译中进行的,因此代码必须返回每次到内存)。“只是为了好玩”,我向 wxFrame 添加了一个新的成员变量 - m_myMainWidget - 并在设置 m_mainWidget 之后立即设置它。然后我让 wxFrame::GetMainWidget() 返回本地值 (m_myMainWidget)。您不知道吗:当我从 gdb 中反汇编时,崩溃仍然发生并且 GetMainWidget 包含相同的 +16 偏移量。 (偏移量不在我使用objdump反汇编的地方。)
最佳答案
根据@Igor 的评论,我查看了使用 -fdump-class-hierarchy
编译器选项的类布局。事实证明,由于 include/wx/app.h
中的这个条件 block ,确实存在 vtable 布局不匹配:
#ifdef __WXDEBUG__
virtual void OnAssert(const wxChar *file,
int line,
const wxChar *cond,
const wxChar *msg);
#endif // __WXDEBUG__
您需要确保使用相同的 __WXDEBUG__
设置编译您的代码。
关于c++ - 段错误 : and the disassembly is different between objdump and gdb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24830584/
为什么调试我的 asp.net 网站时有时会弹出 disassembler/disassemly-window? 它有时会发生,但并非总是如此。我在互联网上搜索过,但没有找到有用的结果。例如:它发生在
所以,我一直在尝试编写一个模拟器,或者至少了解它是如何工作的。我对汇编有一定的了解,尤其是 z80 和 x86,但我从来没有真正理解目标文件(或者在我的例子中是 .gb ROM 文件)如何指示指令的开
我克隆了 riscv-tools 存储库(master 分支)并遵循了构建过程。一切顺利。 然后我尝试为 RV32IM 指令集编译 hello world 程序,这样做: riscv64-unknow
如何从内存转储中反汇编一些指令?我只有原始转储,objdump 只理解对象格式。 我的处理器是 PowerPC 440(PowerPC Book E 架构)。 最佳答案 事实上,objdump 可以很
有没有办法在linux下反汇编windows exe文件? 这会涉及 Wine 吗?如果是的话,是否有适用于 Linux 的 Windows 调试/反汇编程序? 这可以用 gdb 来完成吗? 谢谢。
我反汇编了这个基本的 C 代码,试图弄清楚是什么操作 在堆栈上完成。我在 vm,32 位,gcc 4.4.3,基于 ubuntu 上做 发行版。我用这个标志编译了代码。 gcc -ggdb -mpre
在调试其中一个汇编代码示例时,我发现了以下信息: (gdb) x /10i 0x4005c4 0x4005c4: push %rbp 0x4005c5: mov
我目前正在学习如何反汇编 Mach-O 二进制文件,并且我正在尝试弄清楚如何理解“符号表”(在加载命令 LC_SYMTAB 中)。 如何阅读/解释符号表及其条目?我不是 100%,但看起来每个条目都是
所以我正在尝试使用 Windows API (DbgEng.h/.lib)“反汇编”函数来查看模块中某个函数(我知道它已导出)的指令。但是....它返回了一个意外错误。 IDebugClient* c
我尝试了 .NET 反射器但没有运气。这是主要方式吗? 最佳答案 查看 .NET Reflector 的 BAML 查看器插件。 The plug-in. How to use it. 关于WPF/银
我有一个包含 ARM v8 二进制代码的文件。我想反汇编文件并获取其中包含的实际汇编代码。 假设文件名是 tmp.o 我运行: /opt/linaro/A64-tools/bin/aarch64-li
是否有脚本可用于对一些 objdump --disassemble 输出进行后期处理以使用循环计数进行注释?特别是对于 ARM 系列。 大多数情况下,这只是模式匹配与计数表查找。我猜可能需要像 +5M
是否有脚本可用于对一些 objdump --disassemble 输出进行后期处理以使用循环计数进行注释?特别是对于 ARM 系列。 大多数情况下,这只是模式匹配与计数表查找。我猜可能需要像 +5M
我想在经过混淆的 .Net 程序上运行 Visual Studio 调试器。 (这是我自己的程序 - 我不是要破解别人的程序。) 当我使用“System.Diagnostics.Debugger.Br
我对 C 编程很陌生,所以如果我的问题不是很清楚,我很抱歉,但我在 Visual Studio 中遇到了以下问题: 我正在尝试调试项目中的函数,但是当我在其中放置断点时,我收到以下消息 - "The
当我连续“步入”时,它会在不同的线程之间切换。 但是 Visual Studio 中是如何安排的,它如何知道为下一条指令激活哪个线程? 最佳答案 接下来运行哪个线程并不由 Visual Studio
dis 模块可以有效地用于将 Python 方法、函数和类反汇编为低级解释器指令。 我知道dis信息可以用于: 1. 在使用线程的程序中查找竞争条件 2.寻找可能的优化 根据您的经验,您是否知道 Di
[深呼吸。]我们有一个使用 WxMotif 2.6.3 弹出窗口的应用程序(GUI 库过去不是——现在也不是——我的选择)。它在 32 位 ix86 系统上运行良好。我的任务是将它转换为 64 位应用
x86 反汇编器如何知道在哪里分解指令? 我在看 8088指令系统。例如,移动指令有 7 种变化,范围从 2 到 4 个字节。指令本身似乎没有遵循特定的顺序。 Why is x86 ugly?的另一个
我正在开发一个项目,该项目使用汇编器模式将 LinqToEntity 实体组装成服务级别的数据传输对象,然后将其传递到客户端层以供使用。该方法是将实体对象转换为简化的平面对象,提供特定于服务调用的信息
我是一名优秀的程序员,十分优秀!