![]() |
![]() HP OpenVMS Systemsask the wizard |
![]() |
The Question is: Is there any way to force a system crash when ACCVIO occurs. We have one application which gives access violation on one machine but works fine on other system of identical configuration. We want to analyze the complete system (like resource allocation, any bottlenecks in quota's etc.,) at the moment when it gives access violation. So it would be helpful if we can make system crash immediatey when it encounters a access violation. This crash dump can be analyzed to identify the root cause of the problem. Thx in advance. The Answer is : A signal handler that uses a sys$cmkrnl call to call a Macro32 or C routine that requests a BUGCHECK would seem reasonable. Alternatively, a sys$cmexec call could be used in conjunction with the BUGCHECKFATAL system parameter, to allow the process or the system to bugcheck either the process or the system based on the current setting of the system parameter. The CMEXEC or CMKRNL privilege will be required. By default, fatal system bugchecks can only be requested from within inner-mode code; from privileged-mode code. In C, a routine that calls the bug_check macro looks like this: #include <ssdef.h> #include <vms_macros.h> void CallBugCheck() { bug_check( INCONSTATE, FATAL, COLD ); bug_check( CUSTOMER, FATAL, WARM ); return; } where the bug_check macro is defined within vms_macros.h. (The example shown will never call the second bug_check, much less invoke the return, for obvious reasons.) To LINK the C code, you will want to use a LINK command involving the following qualifiers: $ LINK/SYSEXE/NOSYSLIB OBJECT_MODULE, - SYS$LIBRARY:VMS$VOLATILE_PRIVATE_INTERFACES - /INCLUDE=(BUGCHECK_CODES)/LIBRARY Do note that the C program is linked using /NOSYSLIB, and specifically links the image this way because you do not and cannot reference any user-mode C run-time library routines -- or any other user-mode RTL routines, for that matter -- from within any OpenVMS kernel-mode code. (The kernel-mode code can also encounter duplicate symbols during the LINK, if both the user-mode and the kernel-mode C libraries are erroneously referenced within the same LINK command.) In Macro32, a routine that calls the BUG_CHECK macro (at an address labeled 10$) looks like this: 100$: BUG_CHECK INCONSTATE,FATAL MOVZBL #SS$_NORMAL,R0 RET The CUSTOMER bugcheck code would likely be the best choice for both this and for other similar purposes. The bugcheck codes (BUG$_bugcheck) are resolved at link time (and not via include definitions), indirectly based on the external symbols created from the OpenVMS source module BUGCHECK_CODES.REQ (in facility LIB). A user-written system service can be utilized to allow the code to enter executive or kernel mode, particularly where the service is installed only when the bugcheck is to be taken, or is only present on the system when the bugcheck is to be taken. A user-written system service should NOT be available except during debugging, otherwise a nefarious user could call the routine and trigger a system bugcheck. The user-written system service could be dynamically activated indirectly via a call to a standard shareable image via lib$find_image_symbol, and the standard shareable image then calls the user-written system service. (The use of the standard shareable image is a requirement of the call to lib$find_image_symbol. It also permits the user-written system service to be entirely missing from the system or simply not installed, permitting the creation of a routine that can trap failures when the user-written system service is called when it is not installed, or not present.)
|