我习惯于在链接器映射中看到每个模块或函数都分配了一个不同的地址。我不明白为什么链接器在这种情况下为多个模块分配相同的地址( 006539d0 ):
> 0001:002529d0 ?bottom@DRECT@@QBEHXZ 006539d0 f i pg_trellis.obj
> 0001:002529d0 ?getBottom@BIG_RECT@@QBEJXZ 006539d0 f i PG066.obj
> 0001:002529d0 ?MemAllocated@?$ARRAY@VcLineTr@@@@QBEJXZ 006539d0 f i pg_trellis.obj
> 0001:002529d0 ?get_fmt_idx@CellFormat@ExcelFormat@@QBEHXZ 006539d0 f i ExcelFormat.obj
> 0001:002529d0 ?base@cMapFile@@QAEPAXXZ 006539d0 f i IE_talker.obj
> 0001:002529d0 ?getCurrAIsubject@cListBox@@QAEIXZ 006539d0 f i PG_SCROL.obj
> 0001:002529d0 ?rdstate@ios_base@std@@QBEHXZ 006539d0 f i BasicExcel.obj
> 0001:002529d0 ?NumItems@?$WBHash@PAVcDN@@@@QAEJXZ 006539d0 f i pg164.obj
还有其他一组功能共享同一个地址。大多数功能都有唯一的地址。
这些功能没有什么不寻常之处;它们是分开的,没有任何共同之处。 (编辑:错误:它们相同)。
我应该如何破译堆栈跟踪,并确定哪个功能在运行?
我正在使用Visual Studio 2010; Windows 7.这是一个32位的Win32项目。
编辑:我说的太快,没有仔细检查细节。事实上,这些功能几乎相同:
class DRECT
{ private:
RECT m_rect;
inline int bottom(void) const // get
{ return m_rect.bottom; // a LONG in tagRECT (Win32)
}
}
class BIG_RECT : private tagRECT
{
inline LONG getBottom(void) const
{ return bottom; // a LONG in tagRECT (Win32)
}
}
struct CellFormat
{ int get_fmt_idx() const
{ return _fmt_idx; // an int
}
}
class cListBox
{ inline PG_PIN getCurrAIsubject(void)
{ return m_currAISubject; // an unsigned int
}
}
template <class T> class ARRAY
{ inline ARLONG MemAllocated() const
{ return num_elems; // a long
}
}
我想我必须查看堆栈中的调用函数来确定调用哪个特定函数。