assemble 语言调试信息的解释
interpretation of debugging information in assemble language
0x00473a28 <+0>: push %ebp
0x00473a29 <+1>: mov %esp,%ebp
0x00473a2b <+3>: sub [=11=]x8,%esp
0x00473a2e <+6>: call 0x419150 <mcount>
0x00473a33 <+11>: mov %ecx,-0x4(%ebp)
0x00473a36 <+14>: mov 0x8(%ebp),%eax
=> 0x00473a39 <+17>: mov (%eax),%edx
0x00473a3b <+19>: mov -0x4(%ebp),%eax
0x00473a3e <+22>: mov %edx,(%eax)
0x00473a40 <+24>: mov 0xc(%ebp),%eax
0x00473a43 <+27>: mov %eax,(%esp)
0x00473a46 <+30>: call 0x4837c8 <std::forward<hash_tree_node*&>(std::remove_reference<hash_tree_node*&>::type&)>
0x00473a4b <+35>: mov (%eax),%edx
0x00473a4d <+37>: mov -0x4(%ebp),%eax
0x00473a50 <+40>: mov %edx,0x4(%eax)
0x00473a53 <+43>: leave
0x00473a54 <+44>: ret [=11=]x8
我对assemble语言不太熟悉,尖线表示什么样的问题?
我将从您指向的那一行开始。
0x00473a36 <+14>: mov 0x8(%ebp),%eax
此指令将第一个参数传递给您的函数(您当前正在检查的函数)并将该值存储到 %eax
。
=> 0x00473a39 <+17>: mov (%eax),%edx
此指令现在假设 %eax
中的值是存在于您的应用程序允许的地址 space 中的有效地址。它获取该地址的 32 位值并将该值放入 %edx
.
如果您将无效地址(不在您的应用程序允许的地址 space 内的地址)作为此函数的第一个参数传递,可能会出现问题。例如,如果发生这种情况,或者可能只是未定义的行为,您可能会遇到分段错误。
如果您想进一步检查它,您可以查看此时 %eax
的值,看看它是否是一个合理的地址。或者转到调用此函数的源代码并检查作为第一个参数传递给函数的内容,并确定它是否是指向应用程序数据或已正确分配的堆中数据的有效指针。
0x00473a28 <+0>: push %ebp
0x00473a29 <+1>: mov %esp,%ebp
0x00473a2b <+3>: sub [=11=]x8,%esp
0x00473a2e <+6>: call 0x419150 <mcount>
0x00473a33 <+11>: mov %ecx,-0x4(%ebp)
0x00473a36 <+14>: mov 0x8(%ebp),%eax
=> 0x00473a39 <+17>: mov (%eax),%edx
0x00473a3b <+19>: mov -0x4(%ebp),%eax
0x00473a3e <+22>: mov %edx,(%eax)
0x00473a40 <+24>: mov 0xc(%ebp),%eax
0x00473a43 <+27>: mov %eax,(%esp)
0x00473a46 <+30>: call 0x4837c8 <std::forward<hash_tree_node*&>(std::remove_reference<hash_tree_node*&>::type&)>
0x00473a4b <+35>: mov (%eax),%edx
0x00473a4d <+37>: mov -0x4(%ebp),%eax
0x00473a50 <+40>: mov %edx,0x4(%eax)
0x00473a53 <+43>: leave
0x00473a54 <+44>: ret [=11=]x8
我对assemble语言不太熟悉,尖线表示什么样的问题?
我将从您指向的那一行开始。
0x00473a36 <+14>: mov 0x8(%ebp),%eax
此指令将第一个参数传递给您的函数(您当前正在检查的函数)并将该值存储到 %eax
。
=> 0x00473a39 <+17>: mov (%eax),%edx
此指令现在假设 %eax
中的值是存在于您的应用程序允许的地址 space 中的有效地址。它获取该地址的 32 位值并将该值放入 %edx
.
如果您将无效地址(不在您的应用程序允许的地址 space 内的地址)作为此函数的第一个参数传递,可能会出现问题。例如,如果发生这种情况,或者可能只是未定义的行为,您可能会遇到分段错误。
如果您想进一步检查它,您可以查看此时 %eax
的值,看看它是否是一个合理的地址。或者转到调用此函数的源代码并检查作为第一个参数传递给函数的内容,并确定它是否是指向应用程序数据或已正确分配的堆中数据的有效指针。