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 的值,看看它是否是一个合理的地址。或者转到调用此函数的源代码并检查作为第一个参数传递给函数的内容,并确定它是否是指向应用程序数据或已正确分配的堆中数据的有效指针。