View Full Version : Aufrufstapel per API
Ottersberg
31-01-13, 15:55
Moin,
ich wollte ein Programm erstellen, dass für einen Job die geöffneten Dateien mit dem evtl. im Zugriff befindlichem Satz und die aktiven Programme mit der Anweisung an der sich der Job befindet, ausgibt. Also quasi die Auswahlen "Offene Dateien" und "Aufrufstapel" des Jobs.
Die offenen Dateien habe ich mit QDMLOPNF hinbekommen.
Den Aufrufstapel bekomme ich mit QWVRCSTK. Jetzt zum Problem. So wie ich das sehe, komme ich nicht an die aktuelle Anweisung. Das Feld "MI instruction number" geht nicht bei ILE.
Gibt es eine API mit der ich an diese Information komme?
Die benötigten Informationen stehen hier:
Retrieve Call Stack (QWVRCSTK) API (http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/topic/apis/qwvrcstk.htm?resultof=%22%51%57%56%52%43%53%54%4b% 22%20%22%71%77%76%72%63%73%74%6b%22%20#HDRCSTK0200 )
Du musst halt nur das richtige Satzformat auswählen.
Ottersberg
04-02-13, 08:22
Moin,
kannst du mir da nochmal auf die Sprünge helfen? Ich nehme an du meinst CSTK0200 mit STKE0100. Ich sehe da wieder nur "MI instruction number" und dazu steht weiter unter:
MI instruction number: The current machine instruction number in the program. This field is not meaningful for integrated language environment (ILE) procedures. A zero is returned for ILE procedures.
Danke.
Bei ILE musst du wohl eher STKE0300 auswählen und dann Instruction offset verwenden.
Ottersberg
04-02-13, 13:06
Moin,
also ich habe das jetzt mal probiert, bzw. hier (http://www2.systeminetwork.com/code/index.cfm?fuseaction=ShowCodeInFile&Year=2006&Month=03&Page=021&HostType=AS400&FileType=RPGLE&PCName=RtvStk.rp4&HostName=RTVSTK) auch ein komplettes Beispiel gefunden.
Mit CSTK0200 bekomme ich als Format nur STKE0100. Das sieht dann aus wie bei CSTK0100.
Mit CSTK0300 bekomme ich als Format mal STKE0100 und mal STKE0300. In STKE0300 stehen dann aber nicht die ILE-Programme, sondern Sachen wie "snapshot__16DoMatThreadStackFv" oder "processInterrupt__22DoMatThreadStackRemoteFv". Der Beschreibung von STKE0300 nach, ist das ja scheinbar auch für internen Code gedacht:
This format describes the data that is returned for Licensed Internal Code stack frames.
Die ILE-Programme kommen auch hier im Format STKE0100.
Da ich keine Zeit habe, alle Varianten auszuprobieren überlasse ich das dir.
Irgendwas muss es da geben, denn ich glaube nicht, dass die Job-Stackanzeige was anderes verwendet.
Probiers halt weiter, ich habe es noch nicht gebraucht.
wir lesen den Callstack mit der MI-Funktion MATINVS (Materialize Invocation Stack) und MATPTRIF (Materialize Pointer Information) aus
zur Doku: Materialize Invocation Stack (MATINVS) (http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/topic/rzatk/MATINVS.htm)
Materialize Pointer Information (MATPTRIF) (http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/topic/rzatk/MATPTRIF.htm)
und ein Beispiel von i5toolkit: https://i5toolkit.svn.sourceforge.net/svnroot/i5toolkit/rpg/test/t101.rpgle
Ottersberg
05-02-13, 08:06
Moin,
Also ich habe jetzt noch mal alles probiert mit QWVRCSTK. Man kann das ja nur mit CSTK0100, CSTK0200 und CSTK0300 aufrufen.
CSTK0100 gibt für ILE keine Anweisungen zurück.
CSTK0200 und CSTK0300 geben für ILE das Format STKE0100 zurück und dieses wiederum hat keine Anweisungen.
Also meiner Meinung nach geht das mit QWVRCSTK nicht.
Ich werde mir mal MATINVS und MATPTRIF ansehen.
... kann das sein, dass die Programme keine Debug Information haben? Dann geht das wohl mit keiner der verfügbaren Methoden.
D*B
Ottersberg
08-02-13, 12:39
Moin,
bin erst jetzt wieder dazu gekommen. Mit MATINVS und MATPTRIF funktioniert das.
Ein anderes Beispiel ist z.B. auch hier:
https://i5toolkit.svn.sourceforge.net/svnroot/i5toolkit/art/who.rpgle
Und wird erläutert hier:
Sometimes Programs and Procedures Want to Know: Who Am I? | RPG (http://www.mcpressonline.com/programming/rpg/sometimes-programs-and-procedures-want-to-know-who-am-i.html)
... kann das sein, dass die Programme keine Debug Information haben? Dann geht das wohl mit keiner der verfügbaren Methoden.
Die Infos sind da. Im Aufrufstapel sehe ich es ja auch.