Prologue: this knowledge base entry pertains to process crashes or hangs, not ABL errors nor application hangs that are due to the process running a loop in the ABL. These latter issues need to be investigated using regular 4GL debugging techniques. See the Debugging and Troubleshooting Guide for more details. Also, this article is not intended to be a replacement to a thorough debugging and troubleshooting methodology. Whenever possible, crash or hang issues should be submitted to Progress Technical Support as a simple reproducible case that allows Technical Support to reproduce the issue in-house.
When a Progress process is found crashing or hanging, the general approach to diagnose the issue is as follows:
- Try to isolate the specific feature or behavior of the product that is triggering the issue. For this purpose the debugging output options for logging can be useful. See the related articles linked below for details. Then try to find a matching article in the knowledge base.
- If the issue cannot be isolated, or no matching article is found, contact Progress Technical Support for further investigation.
During the troubleshooting process, it may be that the debugging output available through standard product features is not sufficient to provide an understanding about the cause of the issue. Should this case arise, Progress Technical Support may ask to investigate the current internal state of the running process at the moment it crashes or hangs. This requires additional details from the running environment that can be gathered before the issue is submitted to Technical Support. In order to optimize the time needed for a Technical Support investigation, use the information below to prepare the case for submission.
Gather the following details:
- The name (and path) of the executable file running the process being considered. It need to be an executable provided by Progress (i.e. the information below does not apply to 3rd-party executables).
- The exact version number and service pack / patch level of the Progress executable that crashes or hangs. In case of doubt, collect the exact size (in bytes) and time stamp of the executable file.
- A stack trace of the executing process at the point in time where the issue arises. If the process seems to be hanging, multiple stack traces generated at short intervals can be useful to determine whether the process is waiting or running in a loop. To obtain a stack trace:
- If the process is crashing, a protrace file is generated, and the protrace file contains a list of memory addresses and function names, then it may contain a valid stack trace and can be submitted to Technical Support.
- In other cases, consider the two sections below (depending on the operating system).
Consider contacting Progress Technical Support before attempting these steps. In some situations (especially for some executables) these steps will bring no valuable information.
On Unix-related operating systems (Linux included):
Note that the generation of a core file may be disabled on some systems; see the Notes section for details.
If the process is _progress, _proapsv or _mprosrv, and it appears to be hanging:
- Send the signal SIGUSR1 to the hanging process multiple times (at 1-second intervals). This should cause no other side-effect than forcing the generation of a stack trace. The process should continue running afterwards.
- If a protrace file is generated and contains a list of memory addresses and function names, then it may contain an appropriate stack trace and can be submitted to Technical Support.
- Use strace (truss, tusc, etc dependent on OS) to determine if the process is performing any operations. See notes section below for instructions on strace.)
If the process is Java-based (including _sqlsrv2):
- Try to obtain a Java exception log or stack trace. For this purpose refer to your Java VM documentation or contact Progress Technical Support.
If no protrace file is available, the process is not Java-based, and a debugger (dbx, gdb or other) is available on the system:
- If the process is still running, determine the process ID (PID)
- If the process has crashed and a core file has been generated, collect the core file
- Attach the debugger to the process. For example:
dbx <path to executable> <PID or core file>
gdb <path to executable> <PID or core file>
- At the debugger prompt enter the command to generate a stack trace (with gdb and dbx the command is called "where") and save the output. This can be submitted to Technical Support.
It is essential that the <path to executable> used points to the exact same executable running the process that is seen hanging or crashing.
If no protrace file is available, the process is not Java-based, and no debugger is available:
- Ensure that a « core » file is generated. If the process is hanging, send the signal SIGABRT to force the generation of a core file.
- Contact Progress Technical Support for further instructions.
On Microsoft Windows platforms:
If the process is Java-based (including _sqlsrv2.exe):
- Try to obtain a Java exception log or stack trace. For this purpose refer to your Java VM documentation or contact Progress Technical Support.
If no protrace file is available and the process is not Java-based:
Consider using the tool ADPlus from Microsoft to get additional information about the issue.
Prerequisites:
- If the issue is a crash, then the crash must be reproducible. No additional information can be gathered using this method after the crash has happened.
- ADPlus must be installed. See article What is ADPlus and where can it be found?.
- The instructions below refer to the ADPlus executable file adplus.exe; older versions of ADPlus may use adplus.vbs instead.
- The instructions below assume that the current directory is the directory where adplus.exe or adplus.vbs is located. If this is not true, fully qualify the name "adplus.exe" or "adplus.vbs" when running the executable. As of this writing adplus.exe is typically found in "C:\Program Files\Debugging Tools for Windows (x64)" on 64-bit Windows.
- As of this writing there is typically a file adplus.doc in the same directory as adplus.exe. This file contains complete documentation on ADPlus usage.
For hanging processes:
- Obtain the process ID of the process (using Windows' Task Manager)
- Use ADPlus to generate a memory dump and stack trace of the hanging process:
adplus.exe-hang -p <PID> -o <desired output directory>
- Collect the generated log file and memory dump. As a first step send the log file to Progress Technical Support. Archive the memory dump in case the Technical Support engineer requests it at a later time.
- Use Process Monitor to see if the process is performing any operations. (See download link in Notes section below.)
For crashing processes, when the crash does not happen immediately on startup:
- Ensure the process is started
- If the crash is known to happen in a specific process:
- Obtain the process ID of the process (using Task Manager)
- Attach Adplus to the process:
adplus.exe -crash -p <PID> -o <desired output directory>
- If the crash can happen in multiple running processes based on the same executable file:
- Determine the name of the running image (executable name)
- Attach Adplus to the family of processes:
adplus.exe -crash -pn <process name> -o <desired output directory>
- Trigger the crash or wait for it to happen
- After the crash happens, collect the generated log file and memory dump. As a first step send the log file to Progress Technical Support. Archive the memory dump in case the Technical Support engineer requests it at a later time.
For crashing processes, when the crash happens immediately on startup:
- Start the process with ADplus so that it is immediately attached:
adplus.exe -crash -sc "<path to executable> <command line parameters...>" -o <desired output directory>
- After the crash happens, collect the generated log file and memory dump. As a first step send the log file to Progress Technical Support. Archive the memory dump in case the Technical Support engineer requests it at a later time.