geting stack trace from signal handlers

Timothee Cour thelastmammoth at gmail.com
Thu Jun 6 14:50:47 PDT 2013


Great!
two issues (on OSX at least):

A)
it seems the top-most element of the call stack gets chopped off; eg in
your code, the main_module.main symbol will not appear in the stack trace.
Any idea why or how to fix that?
Is that some inlining issue ? I tried with dmd -g, or -gs or -gc.
This can be annoying when the top-most function is a large function and
it's not at all clear where the code stopped.

B)
there are no line numbers. I did a complex workaround by launching a
process and calling atos to get those, but isn't there a better way?



On Thu, Jun 6, 2013 at 8:44 AM, nazriel <spam at dzfl.pl> wrote:

> On Wednesday, 5 June 2013 at 21:05:53 UTC, Timothee Cour wrote:
>
>> how do i get a stacktrace inside handleTermination?
>>
>> If not currently possible, could we have a compile flag that would enable
>> this kind of feature? (making code slower would be OK, its an opt in
>> feature)
>> Ideally we'd also be able to walk up or down the stack trace (kind of what
>> gdb would do, but I'd like to be able to do that without resorting to gdb,
>> using a language/library solution)
>>
>> ----
>>
>> import core.sys.posix.signal;
>> import std.c.stdlib;
>> import std.stdio;
>>
>> void main(string[] args)
>> {
>>         bsd_signal(SIGINT, &handleTermination);
>>
>>         while (true)
>>         {
>>
>>         }
>> }
>>
>> extern(C) void handleTermination(int signal)
>> {
>>         writefln("Caught signal: %s", signal);
>>         exit(signal);
>> }
>>
>> -----
>>
>
> You mean call stack?
> Maybe something like this:
> http://dpaste.dzfl.pl/99f217be
>
>
> ---
> import core.sys.posix.signal;
> import std.c.stdlib;
> import std.stdio;
> import std.conv;
>
>
> void main(string[] args)
> {
>        bsd_signal(SIGINT, &handleTermination);
>
>        while (true)
>        {
>
>        }
> }
>
> extern(C) void handleTermination(int signal)
> {
>        writefln("Caught signal: %s", signal);
>        getTrace();
>        exit(signal);
> }
>
> extern (C) void* thread_stackBottom();
> extern (C) char** backtrace_symbols(void**, int size);
>
> void getTrace() {
>     void*[10] callstack;
>     void** stackTop;
>     void** stackBottom = cast(void**) thread_stackBottom();
>
>     asm {
>         mov [stackTop], RBP;
>     }
>
>     auto curr = stackTop;
>
>     size_t i;
>     for (i = 0; stackTop <= curr &&
>         curr < stackBottom && i < 10;)
>     {
>         callstack[i++] = *(curr+1);
>         curr = cast(void**) *curr;
>     }
>
>     auto ret = backtrace_symbols(callstack.**ptr, cast(int) i);
>     for (; i > 0; i--) {
>         writeln((*ret).to!string());
>         ret++;
>     }
> }
> ---
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d-learn/attachments/20130606/31596d07/attachment.html>


More information about the Digitalmars-d-learn mailing list