PDA

View Full Version : aktuelles Statement in einem ILE-Programm eines fremden Jobs ermitteln



Seiten : [1] 2

Ottersberg
02-09-14, 10:44
Moin.

Ich möchte von einem laufendem Job (Name/User/Number) die aktuelle Anweisung eines ILE/RPG-Programms ermitteln, so wie es beim DSPJOB OPTION(*PGMSTK) angezeigt wird.
Die API QWVRCSTK kann ich dafür nicht verwenden, da dort die Statements bei ILE-Programmen nicht ausgegeben werden.

Ich habe herausgefunden, dass es wohl über Materialize Invocation Stack (MATINVS) geht. Ein Beispiel von JunLei Li für _MATINVS2 funktioniert und zeigt mir die Statements aber halt nur für den aktuellen Job. Mit _MATINVS1 geht das auch für fremde Jobs aber dafür wird ein System Pointer benötigt. JunLei Li hat auch ein Beispiel dafür. Hier wird über Resolve System Pointer (RSLVSP) vorab ein solcher Pointer ermittelt. RSLVSP braucht als Parameter 2 ein 30A-Object.

Meine Frage ist jetzt wie ich von meinem Job zu diesem Object komme. Ich hab den Vormittag mit Suchen verbracht aber ich kann dazu einfach nichts finden.

Fuerchau
02-09-14, 10:53
Das 30A-Objekt ist in diesem Fall der vollständige Jobname, so wie er z.B. in der SDS steht:
'JJJJJJJJJJUUUUUUUUUUNNNNNN____'.
Zusätzlich ist aber noch der Typ (2-Byte-Hex) erforderlich.

BenderD
02-09-14, 11:20
... den man von QLICVTTP ermitteln lassen kann

D*B

Ottersberg
02-09-14, 12:10
Die Typen stehen auch in diesen zwei Tabellen:
http://www-01.ibm.com/support/knowledgecenter/api/content/ssw_ibm_i_71/apiref/conObject.htm
http://www-01.ibm.com/support/knowledgecenter/api/content/ssw_ibm_i_71/rbam6/rbam6objecttypes.htm

Und aufgrund derer nahm ich an, dass ich nicht einfach die Jobinformationen als Object verwenden kann, denn: Was ist der Typ für einen Job?

BenderD
02-09-14, 13:31
... Du brauchst hier den Job control space pointer, der wohl in einer Systemtabelle (QWCBT_JOB_INDEX) zu finden ist. Dein Beispielprogramm ist hier wohl weniger als die halbe Wahrheit. Ob das ganze Zielführend ist, habe ich so meine Zweifel. Seclevel > 40 geht das wohl ohne Hacks nicht mehr und das komplette Verfahren ist nur schwach dokumentiert, sprich: kann sich mit jedem Release ändern (und ob und wann dann neuere Infos kommen, weiß man nicht (es gab etliche Jahre kein gültiges MI Handbuch). Ach ja - und scharf ist die Information auch nicht (wie auch die call stack Anzeige im Jobmenü).

D*B

D*B

Ottersberg
02-09-14, 15:04
Das ist Mist.

Auf 7.1 scheints die Tabelle auch schon gar nicht mehr zu geben.

Schade drum.

Pikachu
02-09-14, 15:14
Dieser Index sollte schon noch da sein. Mach mal

DMPSYSOBJ OBJ(QWCBT_JOB_INDEX) CONTEXT(QSYS)

und sieh dir die erstellte Spooldatei an.

AG1965_2
02-09-14, 15:16
Ich bin schrecklich neugierig, Ottersberg. Was möchtest Du denn mit diesen Infos machen? Sprich, was soll das Programm, das feststellen kann, wo sich ein Programm in einem anderen Job befindet, eigentlich tun?

BenderD
02-09-14, 15:46
Das ist Mist.

Auf 7.1 scheints die Tabelle auch schon gar nicht mehr zu geben.

Schade drum.

... der ist von der Objekt Art *GENIDX (HexType 0EA4) und muss auch mit MI angepackt werden, was aber die vorher benannten Restriktionen nicht behebt.

D*B

Fuerchau
02-09-14, 16:20
Das API ist schon das Richtige!
Für ILE musst du nur in das richtige Feld des Callstack-Entries schauen:

Statement identifiers. The high-level language statement identifier. If this field contains the character representation of a number, the number is right-adjusted in the field and padded on the left with zeros (for example, '0000000246'). If the call stack entry is for an integrated language environment (ILE) procedure, more than one statement identifier may exist because of the compilers used for ILE languages.