|C H A P T E R 14|
Working With Signals
This chapter describes how to use dbx to work with signals. dbx supports the catch command, which instructs dbx to stop a program when dbx detects any of the signals appearing on the catch list.
The dbx commands cont, step, and next support the -sig signal_name option, which lets you resume execution of a program with the program behaving as if it had received the signal specified in the cont -sig command.
This chapter is organized into the following sections.
When a signal is to be delivered to a process that is being debugged, the signal is redirected to dbx by the kernel. When this happens, you usually receive a prompt. You then have two choices:
signal can be either a signal name or a signal number.
In addition, if a certain signal is received frequently, you can arrange for dbx to forward the signal automatically because you do not want it displayed:
However, the signal is still forwarded to the process. A default set of signals is automatically forwarded in this manner (see ignore Command).
By default, the catch list contains many of the more than 33 detectable signals. (The numbers depend upon the operating system and version.) You can change the default catch list by adding signals to or removing them from the default catch list.
Note - The list of signal names that dbx accepts includes all of those supported by the versions of the Solaris operating environment that dbx supports. So dbx might accept a signal that is not supported by the version of the Solaris operating environment you are running. For example, dbx might accept a signal that is supported by the Solaris 9 OS even through you are running the Solaris 7 OSt. For a list of the signals supported by the Solaris OS you are running, see the signal(3head) man page.
To see the list of signals currently being trapped, type catch with no signal argument.
To see a list of the signals currently being ignored by dbx when the program detects them, type ignore with no signal argument.
You control which signals cause the program to stop by moving the signal names from one list to the other. To move signal names, supply a signal name that currently appears on one list as an argument to the other list.
For example, to move the QUIT and ABRT signals from the catch list to the ignore list:
Often programmers working with code that requires floating point calculations want to debug exceptions generated in a program. When a floating point exception like overflow or divide by zero occurs, the system returns a reasonable answer as the result for the operation that caused the exception. Returning a reasonable answer lets the program continue executing quietly. The Solaris OS implements the IEEE Standard for Binary Floating Point Arithmetic definitions of reasonable answers for exceptions.
Because a reasonable answer for floating point exceptions is returned, exceptions do not automatically trigger the signal SIGFPE. Some integer exceptions, such as dividing an integer by zero and integer overflow do, by default, trigger the signal SIGFPE.
To find the cause of an exception, you need to set up a trap handler in the program so that the exception triggers the signal SIGFPE. (See ieee_handler(3m) man page for an example of a trap handler.)
You can enable a trap using:
When you set up a trap handler using the ieee_handler command, the trap enable mask in the hardware floating point status register is set. This trap enable mask causes the exception to raise the SIGFPE signal at run time.
Once you have compiled the program with the trap handler, load the program into dbx. Before you can catch the SIGFPE signal, you must add FPE to the dbx signal catch list.
By default, FPE is on the ignore list.
After adding FPE to the catch list, run the program in dbx. When the exception you are trapping occurs, the SIGFPE signal is raised and dbx stops the program. Then you can trace the call stack using the dbx where command to help find the specific line number of the program where the exception occurs (see where Command).
To determine the cause of the exception, use the regs -f command to display the floating point state register (FSR). Look at the accrued exception (aexc) and current exception (cexc) fields of the register, which contain bits for the following floating-point exception conditions:
For more information on the floating-point state register, see Version 8 (for V8) or Version 9 (for V9) of The SPARC Architecture Manual. For more discussion and examples, see the Numerical Computation Guide.
The dbx cont command supports the -sig signal option, which lets you resume execution of a program with the program behaving as if it had received the system signal signal.
For example, if a program has an interrupt handler for SIGINT (^C), you can type ^C to stop the application and return control to dbx. If you issue a cont command by itself to continue program execution, the interrupt handler never executes. To execute the interrupt handler, send the signal, SIGINT, to the program:
The step, next, and detach commands accept -sig as well.
The event management commands can also deal with signals as events. These two commands have the same effect.
Having the signal event is more useful if you need to associate some pre-programmed action.
In this case, make sure to first move SIGCLD to the ignore list.