[Dwarf-Discuss] Question / Proposal: breakpoints at global C++ constructors and destructors
Hello, this is my first post to this list. Context: I've been a gdb and gcc maintainer in the past, but I'm not a DWARF expert, so my post is from the user's POV. PROBLEM: ability to break in (all) the global objects' constructors (that is, before main() is called), and destructors (after main() ). As a matter of proof of concept, we've developed a gdb script that is also nontrivial and imperfect. FWIW, there were two ways: one implementation-agnostic by regex finding the ctors of all objects and adding breakpoints in all of them, then breaking at main, disabling the former and continuing; another way was implementation-specific, knowing the internals of the __static_initialization_and_destruction_0 mechanism. Our proof of concept used the first approach but had a lot of issues. So, it would be absolutely trivial if there was a DW_CTOR_CALL / DW_DTOR_CALL with the address of the call instruction, so the debugger can break on those calls, and do a step-into to get into the ctor/dtor body. Feedback? Thanks! Daniel. -- Daniel F. Gutson Chief Engineering Officer, SPD San Lorenzo 47, 3rd Floor, Office 5 Córdoba, Argentina Phone: +54 351 4217888 / +54 351 4218211 Skype: dgutson ___ Dwarf-Discuss mailing list Dwarf-Discuss@lists.dwarfstd.org http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org
Re: [Dwarf-Discuss] Question / Proposal: breakpoints at global C++ constructors and destructors
On Sun, Oct 5, 2014 at 12:47 PM, Michael Eager wrote: > On 10/05/14 07:27, Daniel Gutson wrote: >> >> Hello, >> >> this is my first post to this list. >> >> Context: I've been a gdb and gcc maintainer in the past, but I'm not a >> DWARF expert, so my post is >> from the user's POV. >> >> PROBLEM: ability to break in (all) the global objects' constructors >> (that is, before main() is called), >> and destructors (after main() ). >> >> As a matter of proof of concept, we've developed a gdb script that is >> also nontrivial and imperfect. >> FWIW, there were two ways: one implementation-agnostic by regex >> finding the ctors of all objects and >> adding breakpoints in all of them, then breaking at main, disabling >> the former and continuing; >> another way was implementation-specific, knowing the internals of the >> __static_initialization_and_destruction_0 >> mechanism. Our proof of concept used the first approach but had a lot of >> issues. >> >> So, it would be absolutely trivial if there was a DW_CTOR_CALL / >> DW_DTOR_CALL with the address >> of the call instruction, so the debugger can break on those calls, and >> do a step-into to get into the ctor/dtor body. > > > I don't think that a special DWARF TAG would be required for this. > You could use DW_TAG_subprogram to describe the ctor/dtor routine, > marked with with DW_AT_artificial. It's not a solution, because the problem is not identifying the function (the constructor in this case), but the CALL to the constructor. Why? Because the same class could have several global instances, and non-global (attributes, local) instances. So what is needed is to identify the invoking places. > > > -- > Michael Eagerea...@eagercon.com > 1960 Park Blvd., Palo Alto, CA 94306 650-325-8077 -- Daniel F. Gutson Chief Engineering Officer, SPD San Lorenzo 47, 3rd Floor, Office 5 Córdoba, Argentina Phone: +54 351 4217888 / +54 351 4218211 Skype: dgutson ___ Dwarf-Discuss mailing list Dwarf-Discuss@lists.dwarfstd.org http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org
Re: [Dwarf-Discuss] Question / Proposal: breakpoints at global C++ constructors and destructors
On Sun, Oct 5, 2014 at 1:07 PM, Michael Eager wrote: > On 10/05/14 08:57, Daniel Gutson wrote: >> >> On Sun, Oct 5, 2014 at 12:47 PM, Michael Eager wrote: >>> >>> On 10/05/14 07:27, Daniel Gutson wrote: >>>> >>>> >>>> Hello, >>>> >>>> this is my first post to this list. >>>> >>>> Context: I've been a gdb and gcc maintainer in the past, but I'm not a >>>> DWARF expert, so my post is >>>> from the user's POV. >>>> >>>> PROBLEM: ability to break in (all) the global objects' constructors >>>> (that is, before main() is called), >>>> and destructors (after main() ). >>>> >>>> As a matter of proof of concept, we've developed a gdb script that is >>>> also nontrivial and imperfect. >>>> FWIW, there were two ways: one implementation-agnostic by regex >>>> finding the ctors of all objects and >>>> adding breakpoints in all of them, then breaking at main, disabling >>>> the former and continuing; >>>> another way was implementation-specific, knowing the internals of the >>>> __static_initialization_and_destruction_0 >>>> mechanism. Our proof of concept used the first approach but had a lot of >>>> issues. >>>> >>>> So, it would be absolutely trivial if there was a DW_CTOR_CALL / >>>> DW_DTOR_CALL with the address >>>> of the call instruction, so the debugger can break on those calls, and >>>> do a step-into to get into the ctor/dtor body. >>> >>> >>> >>> I don't think that a special DWARF TAG would be required for this. >>> You could use DW_TAG_subprogram to describe the ctor/dtor routine, >>> marked with with DW_AT_artificial. >> >> >> It's not a solution, because the problem is not identifying the >> function (the constructor >> in this case), but the CALL to the constructor. >> Why? Because the same class could have several global instances, and >> non-global >> (attributes, local) instances. >> So what is needed is to identify the invoking places. > > > If what you want to do is break at all constructors/destructors, I No, not *all*, only for those instances which ar grlobal > don't see why you need to break at the calling site. because otherwise I would break in all non-global instances' construction too. > > Can you give an example? OK: struct Base { Base(int) {} }; struct Der: Base { Der(int x) : Base(x) {} }; Base b1; // break here Der d1; // break at d1's ctor body, not during Der::Base construction int main() { Base b2; // don't break here Der d2;// ditto } > > > -- > Michael Eagerea...@eagercon.com > 1960 Park Blvd., Palo Alto, CA 94306 650-325-8077 -- Daniel F. Gutson Chief Engineering Officer, SPD San Lorenzo 47, 3rd Floor, Office 5 Córdoba, Argentina Phone: +54 351 4217888 / +54 351 4218211 Skype: dgutson ___ Dwarf-Discuss mailing list Dwarf-Discuss@lists.dwarfstd.org http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org
Re: [Dwarf-Discuss] C++14 and C++03 (vs C++98)
(Sorry top posting) What about new C++11 keywords? Would a debugger cli interpreter be helped by this datum in case the user enters some of these keywords? (I can bring the list, only "noexcept" comes from the top of my mind currently) -Original Message- From: Mark Wielaard Sender: "Dwarf-Discuss" Date: Wed, 26 Nov 2014 11:23:21 To: Subject: Re: [Dwarf-Discuss] C++14 and C++03 (vs C++98) Looks like Tom's reply never made the dwarf mailinglist. So here it is to make the archive on this issue complete. On Tue, 2014-11-25 at 09:02 -0700, Tom Tromey wrote: > Michael> Issue 120628.1 mentions a need to distinguish between C++03 and other > Michael> versions of C++. If you believe that DW_LANG_C_plus_plus_03 is not > Michael> necessary, I suggest that you discuss this with the submitter, Tom > Michael> Tromey, to understand why he believes that this is required. > > Mark & I discussed it and I couldn't remember any reason that this was > needed. > > Tom ___ Dwarf-Discuss mailing list Dwarf-Discuss@lists.dwarfstd.org http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org ___ Dwarf-Discuss mailing list Dwarf-Discuss@lists.dwarfstd.org http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org
Re: [Dwarf-Discuss] C++14 and C++03 (vs C++98)
On Wed, Nov 26, 2014 at 11:00 AM, Mark Wielaard wrote: > On Wed, 2014-11-26 at 13:22 +0000, Daniel Gutson wrote: >> What about new C++11 keywords? Would a debugger cli interpreter be >> helped by this datum in case the user enters some of these keywords? > > Yes, that is the intention. If there are different language variants > that have different keywords or when certain DWARF constructs can be > interpreted differently depending on the version used in the source. For > C++11 there certainly is a usage. > > But C++03 does not change the language in any way from C++98 represented Yes, IIRC it's a corrigendum actually. I got misled by the subject of the email :) sorry. > by DW_LANG_c_plus_plus. It really isn't a different language variant, > just some library extensions (and the library will be described by > existing DWARF constructs already). So the question is whether the > proposed DW_LANG_c_plus_plus_03 constant is actually needed, and if > adopted by DWARFv5, how a producer and consumer need to interpret it. > > Cheers, > > Mark -- Daniel F. Gutson Chief Engineering Officer, SPD San Lorenzo 47, 3rd Floor, Office 5 Córdoba, Argentina Phone: +54 351 4217888 / +54 351 4218211 Skype:dgutson LinkedIn: http://ar.linkedin.com/in/danielgutson ___ Dwarf-Discuss mailing list Dwarf-Discuss@lists.dwarfstd.org http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org