geting stack trace from signal handlers
Timothee Cour
thelastmammoth at gmail.com
Thu Jun 6 15:00:03 PDT 2013
just to be clear, this is what i get:
0 test_stacktrace_sigint 0x0000000102e2f69f
handleTermination + 35
1 libsystem_c.dylib 0x00007fff919d794a _sigtramp + 26
2 ??? 0x0000000000000005 0x0 + 5
3 test_stacktrace_sigint 0x0000000102e4c18d
D2rt6dmain211_d_run_mainUiPPaPUAAaZiZi7runMainMFZv + 33
iterm#2 is unreadable.
On Thu, Jun 6, 2013 at 2:50 PM, Timothee Cour <thelastmammoth at gmail.com>wrote:
> 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/36092766/attachment-0001.html>
More information about the Digitalmars-d-learn
mailing list