Throw stack trace from program kill

Paul Backus snarwin at gmail.com
Sun Jan 16 18:03:53 UTC 2022


On Sunday, 16 January 2022 at 15:15:07 UTC, Hipreme wrote:
> Is there some way to throw a stack trace when killing the 
> program from the CTRL+C from the terminal?
>
> It would help a lot into debugging occasional infinity loops

On POSIX, you can use the `sigaction` function to install a 
signal handler for `SIGINT`, the signal generated by CTRL+C. To 
terminate the program with a stack trace, simply have the signal 
handler `throw` an `Error`.

Here's an example program that demonstrates the technique:

```d
import core.sys.posix.signal;

extern(C) void handleCtrlC(int)
{
	throw new Error("Killed by CTRL+C");
}

void main()
{
	sigaction_t act = { sa_handler: &handleCtrlC };
	int errcode = sigaction(SIGINT, &act, null);

	f(); // call some functions
}

void f() { g(); }

void g() { h(); }

void h()
{
	while (1) {} // wait for ctrl+c
}

```

Make sure to compile with the `-g` option if you want your stack 
trace to have filenames and line numbers.


More information about the Digitalmars-d-learn mailing list