在反汇编代码中跟踪调用堆栈

Aru*_*nmu 5 c c++ assembly gdb x86-64

我正在尝试调试一个棘手的核心转储(来自 -O2 优化的二进制文件)。

// Caller Function 
void caller(Container* c)
{
  std::list < Message*> msgs;
  if(!decoder.called(c->buf_, msgs))
  {
   ....
   .....
  }
// Called Function
bool
Decoder::called(Buffer* buf, list < Message*>& msgs)
{
   add_data(buf); // Inlined code to append buf to decoders buf chain
   while(m_data_in && m_data_in->length() > 0)
   {
     .....
   }
}
Run Code Online (Sandbox Code Playgroud)

在调用者和被调用者中,第一个参数都被优化了,这意味着它必须在寄存器中的某个地方。

来电拆解:

推 %r15
移动 %rdi,%r15
推 %r14
推 %r13
推 %r12
推 %rbp
推 %rbx
子 $0x68,%rsp
测试 %rsi,%rsi
je 0x8ccd62 
cmpq $0x0,(%rsi)
je 0x8ccd62 
lea 0x40(%rsp),%rax
lea 0x1b8(%rdi),%rdi
mov %rax,(%rsp)
移动 %rax,0x40(%rsp)
移动 %rax,%rdx
移动 %rax,0x48(%rsp)
移动 (%rsi),%rsi
呼叫q 0x8cc820 

来电登记信息:

rax 0x7fbfffc7e0 548682057696
rbx 0x2a97905ba0 182931446688
rcx 0x0 0
rdx 0x2 2
rsi 0x1 1
rdi 0x7fbfffc7e2 548682057698
rbp 0x4f 0x4f
rsp 0x7fbfffc870 0x7fbfffc870
r8 0x40 64
r9 0x20 32
r10 0x7fbfffc7e0 548682057696
r11 0x2abe466600 183580911104
r12 0x7fbfffd910 548682062096 // 这是持有 buf_
r13 0x7fbfffdec0 548682063552
r14 0x5dc 1500
r15 0x2a97905ba0 182931446688
撕裂 0x8cca89 0x8cca89 
eflags 0x206 [PF IF]
cs 0x33 51
SS 0x2b 43
ds 0x0 0
es 0x0 0
文件系统 0x0 0
GS 0x0 0



调用函数反汇编:

推 %r14
推 %r13
移动 %rdx,%r13
推 %r12
移动%rdi,%r12
推 %rbp
推 %rbx
子 $0x10,%rsp
移动 0x8(%rdi),%rdx
测试 %rdx,%rdx
jne 0x8cc843 
jmpq 0x8cc9cb 
移动 %rax,%rdx
移动 0x8(%rdx),%rax
测试 %rax,%rax
移动 %rsi,0x8(%rdx)
移动 0x8(%r12),%rax
测试 %rax,%rax
异或 %edx,%edx
添加 0x4(%rax),%edx
移动 0x8(%rax),%rax
lea 0x8(%rsp),%rsi
移动%r12,%rdi
movq $0x0,0x8(%rsp)

调用函数注册信息

rax 0x7fbfffc7e0 548682057696
rbx 0x2abc49f9c0 183547591104
rcx 0x0 0
rdx 0x2 2
rsi 0x1 1
rdi 0x7fbfffc7e2 548682057698
rbp 0xffffffff 0xffffffff
rsp 0x7fbfffc830 0x7fbfffc830
r8 0x40 64
r9 0x20 32
r10 0x7fbfffc7e0 548682057696
r11 0x2abe466600 183580911104
r12 0x2a97905d58 18293144712​​8
r13 0x7fbfffc8b0 548682057904
r14 0x5dc 1500
r15 0x2a97905ba0 182931446688
撕裂 0x8cc88a 0x8cc88a 
eflags 0x206 [PF IF]
cs 0x33 51
SS 0x2b 43
ds 0x0 0
es 0x0 0
文件系统 0x0 0
GS 0x0 0


问题是,在被调用的函数中,该"add_data"函数似乎什么也没做。所以,想知道在被调用函数的反汇编中,我们是否看到在"buf_"任何地方都使用了指针(在被调用函数中注册 r12)。

我确实在某种程度上了解汇编,但所有这些内联代码都让我感到困惑。
希望在消除所谓的函数反汇编方面有一些帮助。

更新:
add_data 执行以下操作:


if (m_data_in) {
    m_data_in->next = data;
} else {
    m_data_in = data;
}

Mat*_*son 4

这看起来像if (m_data_in)

mov    0x8(%rdi),%rdx
test   %rdx,%rdx
test   %rdx,%rdx
jne    0x8cc843 
jmpq   0x8cc9cb 
Run Code Online (Sandbox Code Playgroud)

现在,我不太知道0x8cc8430x8cc9cb位于您的代码中的位置,因此无法真正进一步跟踪代码。仍然没有足够的代码和信息来准确说明原始问题中发生的情况。如果提供更多信息,我很乐意填写此答案的更多内容。