D 2.0 Stacktrace - similar problems

Denis Koroskin 2korden at gmail.com
Sat Oct 9 16:12:12 PDT 2010


On Sun, 10 Oct 2010 02:52:06 +0400, Austin Hastings <ah08010-d at yahoo.com>  
wrote:

> On 10/8/2010 6:47 PM, Denis Koroskin wrote:
>> On Sat, 09 Oct 2010 02:36:30 +0400, Austin Hastings  
>> <ah08010-d at yahoo.com> wrote:
>>
>>> object.Exception: Test
>>> ----------------
>>> 00 rtdmain2mainrunMain
>>> 01 rtdmain2mainrunAll
>>> 02 main
>>> 03 mainCRTStartup
>>> 04 RegisterWaitForInputIdle
>>>
>>> Thanks for your help, Benjamin!
>>>
>>> My next question would be, why does the stack trace look this way? I'm
>>> throwing the exception from D's main. I assume that's entry #02. But
>>> what are the other two entries, and why are they on the stack?
>
>> D main is not the true program entry point, there is a lot of
>> preparation done (gc_init(), module init, etc) before your main() takes
>> control, and these entries can be safely stripped since they are usually
>> not what you are looking for.
>
> Denis,
>
> Sure, there's stuff in assembly that calls main. What I'm asking about  
> is the stuff *inside* main that isn't in my code. As I see it, either:
>
> 1. The function I named "main" is at #02 on the above, in which case  
> there are two subroutines that I didn't call on the stack. Then I'd like  
> to know what they are, and whatever else anyone can tell me about them.
>
> 2. The function I named "main" is actually "rtdmain2mainrunMain", in  
> which case (a) why was it renamed this horrible value; and (b) what  
> other non-intuitive name manglings (!!) can I expect? (As if there was  
> such a thing as an intuitive name mangling. :-)
>
> 3. The function I named "main" is actually "RegisterWaitForInputIdle",  
> which will totally surprise me, in which case please explain why the  
> stack trace is upside down, and why that name was chosen?
>
> =Austin

There is no your main in that stack trace, it looks like it got ignored or  
something. Try more nested example.

Stack trace is indeed upside-down.

04 I've no idea what RegisterWaitForInputIdle is, just ignore it.
03 mainCRTStartup is any C/C++/D (i.e. any C-based programming language)  
program entry point. C runtime library gets initialized.
02 main is an "extern (C) int main(int argc, char** argv)", defined in  
rt\dmain2.d (part of druntime source). This is where any C/C++/D  
executable starts. In D, this is where Garbage Collector gets initialized,  
module constructors, unittests ran etc
01 rtdmain2mainrunAll that's just a helper function that is called by main
00 rtdmain2mainrunMain - ditto, a try/catch wrapper around YOUR main
-1 main - this one got lost for some reason

In other words, here is how main looks like in D (slightly simplified):

extern (C) int main(int argc, char** argv) // 02
{
     void runAll() // 01
     {
         gc_init();
         initStaticDataGC();
         _minit();
         _moduleCtor();
         _moduleTlsCtor();
         if (runModuleUnitTests())
             runMain();
         else
             result = EXIT_FAILURE;
         _moduleTlsDtor();
         thread_joinAll();
         _d_isHalting = true;
         _moduleDtor();
         gc_term();
     }


     void runMain() // 00
     {
         result = main(args); // -1
     }

     tryExec(&runAll);

     return result;
}

int main(string[] args); // -1, your main

See  
http://dsource.org/projects/druntime/browser/trunk/src/rt/dmain2.d#L324  
for full source code.

Hope that helps.


More information about the Digitalmars-d-announce mailing list