一般来说,我会尝试让我的问题可重现。 在这种情况下我找不到办法。请随时指导我如何获取更多详细信息,我将附上。
在某些情况下,我们以编程方式使用 ABAP 调用堆栈来获取附加信息。即:记录用户调用,在没有其他正确方法来检索变量时,将访问堆栈中较低调用的变量作为最后的手段。
我们遇到过这样的情况,在
HR
模块“MP9XXX00”的中央程序(Module-Pool
为客户特定的PA
infotypes
生成的程序)的调用堆栈中添加了奇怪的字符作为前缀。奇怪的字符是/A\
。
调用程序的完整字符串是/A\MP9XXX00
。
用于获取整个调用堆栈的代码:
lt_call = cl_abap_get_call_stack=>format_call_stack_with_struct( cl_abap_get_call_stack=>get_call_stack( ) ).
/A\MP9XXX00
中没有这样的程序SE80
。
此外,当尝试从调用程序接收变量时,如上所述,如下所示:
ASSIGN |( { ls_call-prog })PSYST| it failes
,导致dump。当我们查看 ST22
时,堆栈不包含任何 /A\MP9XXX00
,而只是 MP9XXX00
(ls_call-prog
包含 /A\MP9XXX00
)。
如前所述,我们无法重现和调试它。刚刚看到结果。
这些字符从哪里来?
我们想到了什么
/A
开头这一事实有关,但是,为什么它会出现?为什么只有几次?为什么只有前两个字符?另一个\
从哪里来?/A\
可能会临时添加到(那些)程序名称中,例如在导入相关传输请求时。也许 A
是为了 Active/Activating
。让我们这么想的是,这种情况在QA
中发生的次数比在生产中发生的次数多。对于
CL_ABAP_GET_CALL_STACK
,/A\
是ABAP调用堆栈的内部/未格式化数据的普通字符部分(方法GET_CALL_STACK
),并且必须对其进行格式化以便删除/A\
(方法FORMAT_CALL_STACK
或FORMAT_CALL_STACK_WITH_STRUCT
)
)。
以下是三种ABAP调用堆栈表示,当然
FORMAT_CALL_STACK_WITH_STRUCT
是最容易使用的:
GET_CALL_STACK
的结果:
PROGRAM_INFO
(100 个字符)
/A\
”CONT
块,可以是在ABAP语句LOAD REPORT中看到,用反斜杠分隔(例如\20180413155837\2128\
EVENT_INFO
(100 个字符)
/A\
”REPOSRC-UDAT
和 REPOSRC-UTIME
的串联)和两个用于确定最终本地类名称的未知数字(可能是 TRIG
的索引) ABAP 加载的块行),用反斜杠分隔(例如 \20180413155837\00033\9\
)MODULE_INFO
(20 个字符)
FORMAT_CALL_STACK
的结果(STRING类型的行):
LOCAL_CLASS_NAME_30=>INTERFACE_NAME_30~METHOD_NAME_30
)FORMAT_CALL_STACK_WITH_STRUCT
的结果(具有 6 个分量的线):
STACK_DEPTH
(整数)KIND
(30)
PROGNAME
(40):主程序INCLUDENAME
(40):包含程序LINE
(整数)EVENT
(61):事件/过程(事件名称、功能模块、方法、子程序)测试ABAP代码:
REPORT zzsro_test01.
PERFORM my_subroutine.
FORM my_subroutine.
DATA(unformatted_call_stack) = cl_abap_get_call_stack=>get_call_stack( ).
DATA(formatted_call_stack) = cl_abap_get_call_stack=>format_call_stack( unformatted_call_stack ).
DATA(structure_formatted_call_stack) = cl_abap_get_call_stack=>format_call_stack_with_struct( unformatted_call_stack ).
ENDFORM.