声明:本文来自Jerry Wang在SAP社区的一篇分享,本人在学习过程中顺便做了翻译。
Jerry 是我很喜欢的一位作者,经常能够从他的文章中学到东西,我在这里表示感谢。
目录
方法1 - 在ABAP工作台中使用“使用位置列表”功能
方法2 - 在ABAP调试其中使用监控点观察sy-msgid
如何在弹出窗口开启调试模式
方法3 - 利用消息断点类型更有效地进行调试
方法4 - 扫描源代码
方法5 - 使用SAT(ABAP运行时间分析工具)
方法6 - 你是否这样使用过ST05
我喜欢分享我在日常生活中的调试技巧,这写技巧是我生活更加轻松。如果你发现你的技巧未在文中列出,请在评论中说明,以便对更多人产生帮助。
我将用一个简单的例子来演示。在SE38中输入一个无效的名称,然后单击显示按钮,会在底部出现一条消息。我将向你展示如何找到引发此消息的确切代码行。
![](https://img.haomeiwen.com/i140958/9a493fbf20b2c382.png)
注意:这里列出的一些方法对于这种情况可能效率不高,我只是为了完整性列出了我的所有技巧。我相信每个技巧在某些情况下都有用。
方法1 - 在ABAP工作台中使用“使用位置列表”功能
单击消息,我们能发现消息号为DS017。
![](https://img.haomeiwen.com/i140958/5732aa79153a358e.png)
来到SE91,查找使用列表。
![](https://img.haomeiwen.com/i140958/66947e70c9abbc76.png)
然后逐个双击查看,因为我的情况是以错误类型方式显示一个消息。
![](https://img.haomeiwen.com/i140958/9f9102faec1ec865.png)
通过调试可以确认。
![](https://img.haomeiwen.com/i140958/6b78b5d22eecdc1e.png)
小结:本方法需要手动查看代码,在引用位置较多的情况下,需要花费较多的时间。
方法2 - 在ABAP调试其中使用监控点观察sy-msgid
在命令窗口输入/h,然后单击显示,以触发调试模式。
![](https://img.haomeiwen.com/i140958/089fa567c46b8f27.png)
设置条件断点,然后按F8执行,也会到达引发消息的代码。这种方法大概只需要20秒。
![](https://img.haomeiwen.com/i140958/7bf424ee4ff30b99.png)
![](https://img.haomeiwen.com/i140958/853619ac5c8f3feb.png)
如何在弹出窗口开启调试模式
如果涉及弹出窗口,则命令行不可用,在这种情况下,请参阅SAP Note 118184,了解如何切换到调试模式或参考此wiki。
方法3 - 利用消息断点类型更有效地进行调试
使用上面的方式激活调试模式,在如下路径找到消息断点,填入第一步中获得的消息参数。
![](https://img.haomeiwen.com/i140958/5a250b15320fad07.png)
![](https://img.haomeiwen.com/i140958/8136924bf9cf43ea.png)
小结:如果要调试的场景非常复杂,例如涉及多个组件的深度调用堆栈,则调试器可能会经常停留在带有MESSAGE关键字的ABAP代码中。您仍然必须手动检查代码是否是你在找的。尽管如此,它仍然比您逐个手动调试更有效。
方法4 - 扫描源代码
在SE93,输入SE38单击显示,查看详细信息,这里看到它属于包SEDT。
![](https://img.haomeiwen.com/i140958/401b29d7dc6c48a1.png)
然后使用报表 RS_ABAP_SOURCE_SCAN 输入下面的搜索条件。不使用程序 RSABAPPROGRAM 的原因是,它只是一个包装器,SE38的实际实施并不在其中。
![](https://img.haomeiwen.com/i140958/15692cf444434c18.png)
仅有4处结果。
![](https://img.haomeiwen.com/i140958/4e566d0386d665ed.png)
你也可以使用 TCODE: CODE_SCANNER,实现相同的结果:
![](https://img.haomeiwen.com/i140958/de8897d0c4c8bb4c.png)
![](https://img.haomeiwen.com/i140958/c45f66d2f78ab3d3.png)
我个人喜欢这个方法,这帮过我很多次。更重要的是,它不仅可以用作调试技巧,还能用来研究其他人的代码。假设你对某个功能实现特别好奇,你可以想一个有可能的关键词并使用这一功能搜索。
方法5 - 使用SAT(ABAP运行时间分析工具)
使用事务码:SAT,创建一个新变式,确保选中单选项“Aggregation - None”,保存。
![](https://img.haomeiwen.com/i140958/d0b54b4b88e5568a.png)
然后从 SAT 中执行 SE38 。
![](https://img.haomeiwen.com/i140958/0ce032e9d8004706.png)
像往常一样执行你的步骤,输入一个不存在的程序并单击显示按钮,看到消息后,退出SE38。SAT 将自动展示运行时的跟踪信息,这可能需要一点时间,你可以看屏幕下方的进度条。
![](https://img.haomeiwen.com/i140958/2c44dd5348cb1810.png)
单击“Call Hierarchy”选项卡,通过查找按钮,在 Statement 条件中输入 MESSAGE回车,你将在最后面看到两条结果。
![](https://img.haomeiwen.com/i140958/4c83f2d5cdde0965.png)
![](https://img.haomeiwen.com/i140958/c1d17f4fa921faa1.png)
![](https://img.haomeiwen.com/i140958/9a657f21feec5797.png)
双击选中的行就能看到源代码。
小结:如果您使用SAT跟踪的场景很复杂,您将获得一个巨大的跟踪文件。虽然您可以在跟踪文件中指定一个非常大的大小,但根据我的实际经验,当结果跟踪文件超过1 G时,您将无法打开结果跟踪文件,至少在我的应用程序服务器中是这样。
![](https://img.haomeiwen.com/i140958/4f1f7b0a9c06b7ae.png)
方法6 - 你是否这样使用过ST05
首先打开 SE38,输入不存在的名称。
再打开一个 ST05 新窗口,使用默认设置。
回到 SE38,单击显示按钮。
回到 ST05,停用并显示跟踪结果:
我们知道 PROGDIR 表存储报告的头信息。它让 ABAP 编辑器通过在该表中搜索来检查程序名是否有效。因此,如果数据库搜索失败,毫无疑问的下一步就是提出消息。单击“Display ABAP call location”按钮转到源代码:
![](https://img.haomeiwen.com/i140958/c474e2bdf88685dd.png)
我们看到的逻辑是首先尝试搜索非活动版本搜索数据库,如果失败,请尝试搜索活动版本。
![](https://img.haomeiwen.com/i140958/5e3ef6be4c7e9b82.png)
我们希望试图找到的代码就在第770行和第775行的SQL语句的附近。这次很幸运,它在第806行。
![](https://img.haomeiwen.com/i140958/bcda1ce742b10a86.png)
参考文献:
[1]. Six kinds of debugging tips to find the source code where the message is raised
网友评论