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