Obtendo o endereço de falha que gerou um sinal UNIX

Estou interessado em um manipulador de sinal que possa identificar o endereço da instrução que causou o problema.

Eu sei sobresiginfo_t e__builtin_return_address e nem parecem funcionar:

#include <iostream>
#include <signal.h>

void handler (int, siginfo_t *, void *);

int main ()
{
begin:
    std :: cerr << &&begin << " ~ " << &&before << " ~ " << &&after << "\n";

    struct sigaction s;
    s .sa_flags = SA_SIGINFO;
    sigemptyset (& s .sa_mask);
    s .sa_sigaction = handler;
    sigaction (SIGSEGV, &s, NULL);

    int * i = NULL;
before:
    *i = 0;
after:
    std :: cout << "End.\n";
}

void handler (int, siginfo_t *si, void *)
{
    std :: cerr << "si:" << si -> si_addr << "\n";
    std :: cerr << "At: " << __builtin_return_address (0) << "\n";
    std :: cerr << "At: " << __builtin_return_address (1) << "\n";
    std :: cerr << "At: " << __builtin_return_address (2) << "\n";
    std :: cerr << "At: " << __builtin_return_address (3) << "\n";
    std :: cerr << "At: " << __builtin_return_address (4) << "\n";
    std :: cerr << "At: " << __builtin_return_address (5) << "\n";
}

Isso gera algo como:

0x10978 ~ 0x10a4c ~ 0x10a54
si:0
At: 0xfb945364
At: 0xfb939e64
At: 0x10a40
At: 0x10740
At: 0
At: Segmentation Fault

assimsiginfo_t é NULL e__builtin_return_address está produzindo valores em algum lugarentre os rótulos nomeados.

Eu esperava que ambos retornassem o valor de&&before. Estou usando essas funções corretamente?

Testado no Linux 2.6.9-89.0.9.Elsmp e SunOS.

questionAnswers(2)

yourAnswerToTheQuestion