如何调试由于 "Jump to the invalid address" 导致的分段错误?
How to debug Segmentation fault due to "Jump to the invalid address"?
我正在开发一个 运行 在 am335x arm 处理器上运行的应用程序。
我正在定义以下结构,其中包含指向 "Command" 函数的函数指针。 "Command" 函数在同一文件中定义如下
ObjectDef BPObjectDef = { CCR_COMMS, 1, ATTRIBUTES, "BP", Command };
static BYTE Command( ObjectPtr Obj, BYTE Command)
{
<not writing code because function is big>
}
我交叉编译了上面的代码并生成了二进制文件。使用 objdump -t
我可以看到 "Command" 函数得到了以下地址
00013f0d l F .text 0000016c Command
但是当我 运行 目标机器上的二进制文件时,我得到以下 "Command" 函数的地址
address of BPObjectDef.Command = 0x3f0d0000
我们可以看到地址的最后两个字节与前两个字节交换了。这会导致在访问此功能时出现分段错误。
以前有人遇到过类似的问题吗?在这种情况下如何调试?我想我不能使用地址消毒器,因为它是一个手臂 platform.Thanks
@Yunnosch 你是天才!正如您在评论中提到的,地址因结构填充而被更改。在结构声明之前使用#pragma pack(1) 解决了这个问题。非常感谢
我正在开发一个 运行 在 am335x arm 处理器上运行的应用程序。 我正在定义以下结构,其中包含指向 "Command" 函数的函数指针。 "Command" 函数在同一文件中定义如下
ObjectDef BPObjectDef = { CCR_COMMS, 1, ATTRIBUTES, "BP", Command };
static BYTE Command( ObjectPtr Obj, BYTE Command)
{
<not writing code because function is big>
}
我交叉编译了上面的代码并生成了二进制文件。使用 objdump -t
我可以看到 "Command" 函数得到了以下地址
00013f0d l F .text 0000016c Command
但是当我 运行 目标机器上的二进制文件时,我得到以下 "Command" 函数的地址
address of BPObjectDef.Command = 0x3f0d0000
我们可以看到地址的最后两个字节与前两个字节交换了。这会导致在访问此功能时出现分段错误。 以前有人遇到过类似的问题吗?在这种情况下如何调试?我想我不能使用地址消毒器,因为它是一个手臂 platform.Thanks
@Yunnosch 你是天才!正如您在评论中提到的,地址因结构填充而被更改。在结构声明之前使用#pragma pack(1) 解决了这个问题。非常感谢