ABAP 调用堆栈中的奇怪前缀(/A\)

问题描述 投票:0回答:1

一般来说,我会尝试让我的问题可重现。 在这种情况下我找不到办法。请随时指导我如何获取更多详细信息,我将附上。

在某些情况下,我们以编程方式使用 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
)。

如前所述,我们无法重现和调试它。刚刚看到结果。

这些字符从哪里来?

我们想到了什么

  1. 我们认为这可能与我们的客户命名空间以
    /A
    开头这一事实有关,但是,为什么它会出现?为什么只有几次?为什么只有前两个字符?另一个
    \
    从哪里来?
  2. 我们认为前缀
    /A\
    可能会临时添加到(那些)程序名称中,例如在导入相关传输请求时。也许
    A
    是为了
    Active/Activating
    。让我们这么想的是,这种情况在
    QA
    中发生的次数比在生产中发生的次数多。
abap callstack sap-hr
1个回答
0
投票

对于

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
是最容易使用的:

Backend Two-Process ABAP Debugger with 3 Tables of formats of CL_ABAP_GET_CALL_STACK

GET_CALL_STACK
的结果:

  • PROGRAM_INFO
    (100 个字符)
    • 1-3(3):“
      /A\
    • 4-43(40):主程序
    • 44-67 (24):主程序的ABAP负载生成的时间戳(TRDIR-UDAT和TRDIR-UTIME的串联)和处理控制块的偏移量(ABAP负载的
      CONT
      块,可以是在ABAP语句LOAD REPORT中看到,用反斜杠分隔(例如
      \20180413155837\2128\
  • EVENT_INFO
    (100 个字符)
    • 1-3(3):“
      /A\
    • 4-43 (40):包括程序
    • 44-70 (27):包含程序的 ABAP 负载生成的时间戳(
      REPOSRC-UDAT
      REPOSRC-UTIME
      的串联)和两个用于确定最终本地类名称的未知数字(可能是
      TRIG
      的索引) ABAP 加载的块行),用反斜杠分隔(例如
      \20180413155837\00033\9\
    • 71-90 (20):事件/程序
  • MODULE_INFO
    (20 个字符)
    • 活动
    • 表格
    • 功能
    • 模块(PAI)
    • 模块(PBO)

FORMAT_CALL_STACK
的结果(STRING类型的行):

  • 1-5(5):堆栈深度
  • 6-6:空间
  • 7-26(20):过程类型(“MODULE(PAI)”等)
  • 27-27:空间
  • 28-67(40):主程序
  • 68-68:空间
  • 69-108 (40):包括程序
  • 109-109:空间
  • 110-114 (5):包含程序中的行号
  • 115-115:空间
  • 116-208 (93):事件/程序(例如
    LOCAL_CLASS_NAME_30=>INTERFACE_NAME_30~METHOD_NAME_30

FORMAT_CALL_STACK_WITH_STRUCT
的结果(具有 6 个分量的线):

  • STACK_DEPTH
    (整数)
  • KIND
    (30)
    • 活动
    • 表格
    • 功能
    • 模块(PAI)
    • 模块(PBO)
  • 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.
© www.soinside.com 2019 - 2024. All rights reserved.