g++-4.0.1 (also reproduced with g++-3.4.4) fails to add the linkage name of the
class constructor to the debugging info, making it impossible to set
breakpoints in classes containing more than one constructor (e.g. with gdb).
How to reconstruct: Save the following as test.hpp:
class TestClass {
int y;
public:
int funcA(void);
TestClass(int x);
~TestClass(void);
};
Save the following as test.cpp:
#include "test.hpp"
int TestClass::funcA(void)
{
return y;
}
TestClass::TestClass(int x)
: y(x)
{
}
TestClass::~TestClass(void)
{
}
int main(void)
{
TestClass a(0);
return a.funcA();
}
Compile g++ test.cpp -ggdb3 -O0, then check the debugging information with
dwarfdump. Here's the important section:
<2>< 105> DW_TAG_subprogram
DW_AT_sibling <153>
DW_AT_external yes(1)
DW_AT_name funcA
DW_AT_decl_file 2 /home/thor/test.hpp
DW_AT_decl_line 4
DW_AT_MIPS_linkage_name _ZN9TestClass5funcAEv
DW_AT_type <208>
DW_AT_declaration yes(1)
<3>< 146> DW_TAG_formal_parameter
DW_AT_type <215>
DW_AT_artificial yes(1)
<2>< 153> DW_TAG_subprogram
DW_AT_sibling <178>
DW_AT_external yes(1)
DW_AT_name TestClass
DW_AT_decl_file 2 /home/thor/test.hpp
DW_AT_decl_line 5
DW_AT_declaration yes(1)
<3>< 166> DW_TAG_formal_parameter
DW_AT_type <215>
DW_AT_artificial yes(1)
<3>< 172> DW_TAG_formal_parameter
DW_AT_type <208>
As seen from the above, member functions do get the full debugging info,
including the mangled name (linkage name), but the constructor does not. This
gets worse in case more than one constructor is available since gdb is then no
longer able to find the entry point.
--
Summary: dwarf2 debug info lacks linkage names for constructors &
destructors
Product: gcc
Version: 4.0.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: debug
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: thor at math dot tu-berlin dot de
GCC build triplet: i686-pc-linux-gnu
GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25793