C++ 在反汇编代码中跟踪调用堆栈
我试图调试一个棘手的内核转储(从一个-O2优化的二进制文件) 这看起来像是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
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