最近因为我的 CSDN 账号暂时不能访问,我就把我那个运营了 607 天的知识星球,里面总共 418 个主题,分门别类进行整理,放到了对应的专栏里,方便新加入的朋友查阅:
今天星球里有朋友提问:
每次 debug 的时候,需要修改内表或者变量的值,前几天想到 debug session 的功能,其中观察点都是有记忆功能,但是变量选项没记忆功能,例如一个内表在某行的时候我修改其中的值,然后保存变式,下次 debug 时候我重新加载保存的变式,但是内表中的值没变化
这个朋友问的是 ABAP 调试器里这个 Debugger Session 的 Save 和 Load 功能:
说实话我虽然 ABAP 调试器用得很熟,但上图这个功能还真没用过。
Load 和 Save 菜单成对出现,这应该是实现 ABAP 调试会话的持久化功能,即把当前会话的各种设置属性值,持久化到某些存储介质里。以及稍后从这些存储介质里,将保存的值重新加载,进行还原。
点击上图 Save 之后,弹出一个对话框,里面分为三个区域。
区域1 指定这个调试会话持久化后的存储介质,是另存到本地文件,还是存储到 ABAP 系统数据库表里。
区域2 指定存储会话的 Technical Name 即技术名称。
区域3 指定当前存储会话的哪些属性需要进行持久化。
这位朋友和我,都对区域3 名叫 Variables 的勾选项觉得疑惑。
这个选项是什么意思?勾上之后,会把当前调试会话的变量内容也进行持久化吗?
我下意识地觉得这不太可能。
试想调试会话里,我们用 OPEN SQL 到数据库表里,读取了大量数据到一个 ABAP 内表变量里。
如果 ABAP 调试会话的保存功能,会把当前调试会话里 ABAP 变量的内容也进行持久化,那也太消耗存储空间了。
当然以上只是我的猜测。
正确与否,需要找证据验证。
我们可以通过查找 SAP 官方帮助文档来验证。
但我更喜欢的办法还是:Talk is Cheap. Show me the Code.
鼠标单击 Variables 区域,按 F1.
在弹出的对话框里,点击 Technical Information:
然后就能看到,调试会话保存对话框里,Variables 这个 Checkbox,其源代码所在的 ABAP 报表名称为 SAPLSTPDA_DEBUG_SESSIONS,Screen number 为 0100,这个 Checkbox 对应的字段名为 VARIABLES.
所以不需要费功夫去查什么文档。直接看源代码,不就知道这个字段的作用了吗?
我们在 SE80 里打开上面找到的 ABAP 程序,定位到 0100 这个 Screen,第 8 行 PROCESS AFTER INPUT 负责的就是处理用户输入。
第 26 行的 user_command_0100 这个 subroutine 里面,就包含了我想要查看的代码。
双击第 26 行,发现它调用了另一个 subroutine ok_code_handling.
那就继续双击:
第 20 行是根据 OK Code 进入对应的分支。
对于 Save 操作而言,执行的逻辑封装在 cl_tpda_debug_session_handler 的 save_session 方法里。
双击这个方法,进去之后,根据我们之前通过 F1 找到的 Variables 的字段名,VARIABLES 进行搜索,找到了一个 IF 分支。
这个分支内的 cl_tpda_variable_manager,看名称就能猜测出,该类负责 ABAP 调试会话里变量的管理。
双击进入这个类。
这些名称带了 DB 的方法,包含了从数据库层面,对 ABAP 调试会话里的变量,进行增删改查的逻辑实现。
随便打开一个方法,终于找到了 TPDA_VARIABLES 这张表。该表就是 ABAP 调试会话选择数据库层面的持久化时,用来存储调试会话里变量信息的场所。
可能有朋友会问,我为什么会按照上面介绍的顺序,来一步步在代码里检索?
我觉得很难讲出一个清晰的规则来。可能是凭借一种对代码的感觉?
如果从 2000 年我进入大学本科,正式学习第一门编程语言 Pascal 算起,我同代码打交道已经 24 年了,并且将一直持续下去。
C,C++,C #,Java,JavaScript,TypeScript,ABAP,Scala,Python,用这些语言编写的代码,就算我之前没有接触过,我也能很快通过阅读源代码的方式,找到我需要的那一段代码。
回到本文我们需要搞清楚的问题上去。
我随便写个 ABAP 报表,在调试器 Variables 窗口里,查看 cv_data, lv_s 和 lt_content 这三个变量的值,然后使用 Debugger Session->Save 功能,将当前会话连同变量信息进行保存:
保存的时候,记得把 Variables Checkbox 勾上,Session 取名 var_test.
保存成功后,根据 var_test 这个名称,到 TPDA_VARIABLES 表里查询,发现调试会话里的变量信息,通过 XML 格式存储到这张表里的。
我们再来看看 XML 的具体内容。
真相大白了。
结论:Variables 的勾选中之后,ABAP 调试器,只会把 Variables 面板里当前使用者正在查看的变量的名称进行持久化。变量的实际内容不会保存下来。
下图是我们选择了 Load 功能之前的 ABAP 调试器,注意 Variables 区域是空的。
选择 Load 之后,保存在数据库表里的变量名称,就自动出现在 Variables 区域了。
当调试一段非常复杂的 ABAP 程序,需要一次性查看多个变量,但因为某种原因,需要中断调试时,可以使用 Save - Load 功能,将正在查看的变量名称保存下来,以备将来的恢复。
本文介绍了另一个例子,即通过阅读源代码来验证自己的猜测,搞清楚系统提供的标准功能到底是如何工作的。
也欢迎大家加入我的知识星球,多多提出像本文这种,看起来容易被忽视,实际背后也包含小小知识点的问题。
网友评论