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

C++ 在反汇编代码中跟踪调用堆栈,c++,c,assembly,gdb,x86-64,C++,C,Assembly,Gdb,X86 64,我试图调试一个棘手的内核转储(从一个-O2优化的二进制文件) 这看起来像是if(m_data_in) 现在,我不太清楚0x8cc843和0x8cc9cb在您的代码中的位置,因此无法进一步了解代码。仍然没有足够的代码和信息来确切说明原始问题中发生了什么。如果提供更多信息,我很乐意填写更多答案。首先,显示add_data()的源代码。然后,请确保您编译的源代码正确,而不是那些add_data()尚未完成的旧源代码。如果不知道add_data和buf的实际外观(没有反汇编的地址也没什么帮助)@Václ

我试图调试一个棘手的内核转储(从一个-O2优化的二进制文件)

这看起来像是
if(m_data_in)


现在,我不太清楚
0x8cc843
0x8cc9cb
在您的代码中的位置,因此无法进一步了解代码。仍然没有足够的代码和信息来确切说明原始问题中发生了什么。如果提供更多信息,我很乐意填写更多答案。

首先,显示
add_data()
的源代码。然后,请确保您编译的源代码正确,而不是那些
add_data()
尚未完成的旧源代码。如果不知道
add_data
buf
的实际外观(没有反汇编的地址也没什么帮助)@VáclavZeman:感谢您的回复。该代码已投入生产大约1.5年了。非常确定添加_数据已经完成。@MatsPeterson:谢谢您的回复。现在我只想知道,buf_uuupassed的地址是否在被调用函数的任何地方使用。正如我所说,我们需要看看
add_udata
的作用。非常感谢您在这方面的帮助。我会再看一次大会,看看你说了些什么。我用平静的心情仔细查看了这个程序集,完全可以看到add_data函数的说明。但是,我无法理解我在被调用的反汇编“movq$0x0,0x8(%rsp)”中发布的最后一条指令的用途。“mov%rsi,0x8(%rdx)”基本上就是将我的第二个参数分配给被调用函数的指令,分配给下一个_uux字段。在此之后,我没有看到任何指令改变“rdx”的值。仍然在寄存器信息中,它显示了一个看似不正确的0x2值。有什么可能的原因吗?另外,我还没有发布整个程序集,因为它非常大,但是你可以相信我上面的评论:)。我已经完全理解了汇编代码。看起来不错,但我想我无法追查到底发生了什么。
// 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)
   {
     .....
   }
}
push %r15 mov %rdi,%r15 push %r14 push %r13 push %r12 push %rbp push %rbx sub $0x68,%rsp test %rsi,%rsi je 0x8ccd62 cmpq $0x0,(%rsi) je 0x8ccd62 lea 0x40(%rsp),%rax lea 0x1b8(%rdi),%rdi mov %rax,(%rsp) mov %rax,0x40(%rsp) mov %rax,%rdx mov %rax,0x48(%rsp) mov (%rsi),%rsi callq 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 // THIS IS HOLDING buf_ r13 0x7fbfffdec0 548682063552 r14 0x5dc 1500 r15 0x2a97905ba0 182931446688 rip 0x8cca89 0x8cca89 eflags 0x206 [ PF IF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 gs 0x0 0 push %r14 push %r13 mov %rdx,%r13 push %r12 mov %rdi,%r12 push %rbp push %rbx sub $0x10,%rsp mov 0x8(%rdi),%rdx test %rdx,%rdx jne 0x8cc843 jmpq 0x8cc9cb mov %rax,%rdx mov 0x8(%rdx),%rax test %rax,%rax mov %rsi,0x8(%rdx) mov 0x8(%r12),%rax test %rax,%rax xor %edx,%edx add 0x4(%rax),%edx mov 0x8(%rax),%rax lea 0x8(%rsp),%rsi mov %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 182931447128 r13 0x7fbfffc8b0 548682057904 r14 0x5dc 1500 r15 0x2a97905ba0 182931446688 rip 0x8cc88a 0x8cc88a eflags 0x206 [ PF IF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 gs 0x0 0

if (m_data_in) {
    m_data_in->next = data;
} else {
    m_data_in = data;
}
mov    0x8(%rdi),%rdx
test   %rdx,%rdx
test   %rdx,%rdx
jne    0x8cc843 
jmpq   0x8cc9cb