11.3. Signals

In the debugger signals are treated like interrupts, and are not in general communicated back the debugger. However, the simulator will report memory access violations and illegal instructions by stopping the application program and returning a status code to the debugger to indicate what has happened.

A signal is an asynchronous event that can happen in a program. The operating system defines the possible kinds of signals, and gives each kind a name and a number. For example, in UNIX SIGINT is the signal a program gets when you type an interrupt (often Ctrl-C); SIGSEGV is the signal a program gets from referencing a place in memory far away from all the areas in use; SIGALRM occurs when the alarm clock timer goes off (which happens only if your program has requested an alarm).

Some signals, including SIGALRM, are a normal part of the functioning of your program. Others, such as SIGSEGV, indicate errors; these signals are fatal (kill your program immediately) if the program has not specified in advance some other way to handle the signal. SIGINT does not indicate an error in your program, but it is normally fatal so it can carry out the purpose of the interrupt: to kill the program.

The debugger has the ability to detect any occurrence of a signal in your program. You can tell the debugger in advance what to do for each kind of signal.

Normally, the debugger is set up to ignore non-erroneous signals like SIGALRM (so as not to interfere with their role in the functioning of your program) but to stop your program immediately whenever an error signal happens. You can change these settings with the handle command.

info signals

Print a table of all the kinds of signals and how the debugger has been told to handle each one. You can use this to see the signal numbers of all the defined types of signals.

info handle is the new alias for info signals.

handle signal keywords...

Change the way the debugger handles signal signal. signal can be the number of a signal or its name (with or without the SIG at the beginning). The keywords say what change to make.

The keywords allowed by the handle command can be abbreviated. Their full names are:

nostop

The debugger should not stop your program when this signal happens. It may still print a message telling you that the signal has come in.

stop

The debugger should stop your program when this signal happens. This implies the print keyword as well.

print

The debugger should print a message when this signal happens.

noprint

The debugger should not mention the occurrence of the signal at all. This implies the nostop keyword as well.

pass

The debugger should allow your program to see this signal; your program can handle the signal, or else it may terminate if the signal is fatal and not handled.

nopass

The debugger should not allow your program to see this signal.

When a signal stops your program, the signal is not visible until you continue. Your program sees the signal then, if pass is in effect for the signal in question at that time. In other words, after the debugger reports a signal, you can use the handle command with pass or nopass to control whether your program sees that signal when you continue.

You can also use the signal command to prevent your program from seeing a signal, or cause it to see a signal it normally would not see, or to give it any signal at any time. For example, if your program stopped due to some sort of memory reference error, you might store correct values into the erroneous variables and continue, hoping to see more execution; but your program would probably terminate immediately as a result of the fatal signal once it saw the signal. To prevent this, you can continue with signal 0. See Giving your program a signal: Signaling.