Introduction
This article describes a method to use a perl debugger on trigger scripts without advanced interprocess debugging tools.
Using a perl debugger with a V4.x server side trigger launched by the server is very difficult and encounters two known obstacles:
Summary
Details
I extend AccuRev functionality to support development processes and I create complex triggers that are easier to develop with a Perl debugger; this is especially true when your triggers are manipulating issue tracking data. The AccuRev CLI manual provides good information about the triggers but you might need subtle details that are beyond the scope of the documentation. Walking through trigger execution with a debugger gives details about the content of the parameter files and what is passed from trigger to trigger.
I am not aware of any special options to allow the AccuRev server to run Perl triggers in debug mode and my attempts to do so create an unworkable environment. Since triggers are driven by parameter files, I’ve added routines to all the triggers to collect their parameter files. Once I have a collection of interesting parameter files I can launch the trigger scripts with my own Perl debugging tool of choice instead of them being launched by the AccuRev server. I can also inject faulty data via the parameter file for testing.
The AccuRev server creates a temporary parameter file for each trigger it is calling. The file name will be a relative path to a temporary directory and each filename will be a sequence number. Please note that a trigger can be fired more than once for a transaction. The temporary file name does not indicate the target trigger script; the trigger name and the AccuRev command that fired the script are embedded in the parameter file.
I embrace the concept of continuous improvement so I anticipate trigger debugging will used many times over the years. I used a semaphore file to enable and disable the parameter dump functionality to eliminate edits to the trigger scripts on the live repository. I’ve even attached captured parameter files to issue tickets I’ve submitted to AccuRev support.
Capturing Parameter Files
The AccuRev server determines what trigger to launch then creates one or more temporary files in the cache directory of the site slice and passes a relative directory name and file name(s) in the argument list to the trigger. The server process will ensure a unique sequence number when multiple threads launch the same trigger at the same time.
The steps I use are:
Appendix A has an excerpt of my server_admin_trig.pl and trigger utility module. I save off the parameter file immediately after the trigger has digested the XML data.
I strive to write my perl code to be operating system agnostic. I keep my common trigger code in a perl module that resides in the accurev “bin” directory. I like to avoid external environment dependencies so I explicitly state the lib path (in an OS agnostic way) to my trigger utility module. I do this because the “use” is a compile time directive and is processed before variables are defined.
Debugging the Trigger with the Captured Parameter File
You must make a copy of the captured trigger parameter file before you use it. Triggers re-initialize the parameter file to pass data back to the server so your captured data will be lost.
You launch a perl debugger and pass the trigger parameter file into the script as the first command line argument. Debug to your heart’s content.
NOTE: The script will reinitialize the parameter file for output. You must copy “test.dat.org” to “test.dat” before you restart the debugging session.
Appendix A:
Sample of Captured Trigger Data
Below is the trigger parameter file captured from server_admin_trig.pl for a “mkdepot” command.
This is a simple example. The parameter data gets much more interesting when your objective is to mine transaction or issue tracking details.
Capture file name is: /opt/accurev/ar6060/trigDumpDir/server_admin_trig-0_0-1248023869
<triggerInput>
<depot>test10</depot>
<hook>server_admin_trig</hook>
<command>mkdepot</command>
<principal>ar6060</principal>
<ip>127.0.0.1</ip>
</triggerInput>