【发布时间】:2014-05-29 20:34:24
【问题描述】:
我正在尝试调试一个棘手的核心转储(来自 -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)
{
.....
}
}
在调用者和被调用者中,第一个参数都被优化了,这意味着它必须在寄存器中的某个地方。
调用者反汇编:
来电登记信息:
调用函数反汇编:
调用函数注册信息
:
问题是,在被调用的函数中,"add_data" 函数似乎什么也没做。
所以,想知道在被调用函数的反汇编中,我们是否看到"buf_"指针在任何地方被使用(在被调用函数中注册r12)。
我确实在一定程度上了解汇编,但所有这些代码内联都让我感到困惑。
希望能在消除被调用函数反汇编方面提供一些帮助。
更新:
add_data 如下:
if (m_data_in) {
m_data_in->next = data;
} else {
m_data_in = data;
}
【问题讨论】:
-
首先,还要显示
add_data()的来源。然后,确保您正在编译正确的源代码,而不是add_data()尚未完成的旧版本。 -
很难说不知道
add_data和buf的实际样子(并且在反汇编中没有地址也无济于事) -
@VáclavZeman:感谢您的回复。这段代码已经投入生产了大约 1.5 年。确定 add_data 已完成。
-
@MatsPetersson:感谢您的回复。这时候我只想知道,传入的buf_的地址是否在被调用函数的任何地方使用。
-
就像我说的,我们需要看看
add_data做了什么。