乐趣区

你的ABAP程序给佛祖开过光么?来试试Jerry这个小技巧

最近 Jerry 在忙一个项目,技术栈换成了 nodejs 平台,语言换成了 JavaScript,因为赶项目进度,一直没时间更新公众号。感谢大家的支持,关注人数还是慢慢地增长到了 3000。

今天我们来聊聊一个比较轻松的话题。
当今这个数字化时代,大家的生活都离不开互联网。互联网公司为了确保服务器不会因为软硬件问题宕机而影响自己的业务,纷纷使出浑身解数,包括设计更健壮的架构,实现高质量的代码,提供硬件条件更好的机房等。当然也有一些脑洞大开的公司,另辟蹊径,采取让佛祖对服务器进行开光的方式,来实现 ” 服务器永不宕机 ” 的美好愿望。
下面是 Jerry 从一则搜狐新闻上看到的一些有趣的图片,转贴于此,新闻原文网址:
http://www.sohu.com/a/1166219…
有请高僧给服务器贴上灵符:

看着这个符咒,Jerry 想起了自己曾经通关过无数遍的仙剑奇侠传 98 柔情版里各种各样的灵符。

高僧正在认真地进行开光仪式:

这些难道是 IT 管理员,或者 SAP 称呼的 Basis 们,虔诚地跪在服务器前向佛祖祈祷“永不宕机”吗?

除了“永不宕机”外,“永无 bug”也是程序员们另一个美好的愿望。
于是乎,有些程序员希望通过在代码头部加上这种注释,来获得一些心理上的慰藉。

而对于 SAP ABAP 程序员,一看到 bug 这个词,最容易联想到什么?不知道大家心中的答案是什么,Jerry 的答案是:ST22。
ABAP 程序在执行时,如果遇到了没有捕捉的异常,程序会终止,同时 ABAP 运行时会产生一个类似 Windows 系统蓝屏的 core dump:

这种 dump 可以在事务码 ST22 里查看。一般来说,一个有经验的 ABAP 程序员,通过分析 ST22 里提供的程序崩溃时的上下文信息,系统变量的内容,调用栈等等,不难修复这种 bug。
下图是 ST22 里 dump 的一个例子,值得一提的是大家可能会忽略的 BASIS Developer View, 里面包含了引起运行时错误的 ABAP 语句对应的 C 语言实现的具体文件位置,比如下图的 //bas/753_STACK/src/krn/abap/runt/abassert.c。

大家还记得我写过的聊聊 C 语言和 ABAP 这篇文章么?
这里我偷个懒,把那篇文章里介绍 C 语言和 ABAP 语言关系的文字引用过来:
为什么这篇文章要把 C 语言和 ABAP 放在一起讲,而不是别的语言比如 Java 和 ABAP 呢?因为 ABAP 语言底层是基于 C /C++ 实现的,包括其关键字 (比如最简单的关键字 WRITE 的 C ++ 实现有 2 千多行) 和虚拟机(ABAP Runtime)。SAP 内部的一群计算机科学家们发明了 ABAP 这门伟大的语言,由它实现的各种 SAP 应用帮助了全球超过 180 个国家和地区的客户们更好地运行其业务。通过 Google 我们能搜索到一些关于这些 SAP 计算机科学家们的介绍,比如这个链接:

http://sapexperts.wispubs.com…

SAP 内部的 Netweaver 开发服务器上是能够浏览这些 C 语言代码的。Jerry 2017 年在德国工作时,业余时间比较多,相关的 C 代码也阅读了不少,比如 ABAP 里最简单的 WRITE 关键字,其 C 语言实现有 2000 多行。可惜因为这些 C 语言实现对客户和 partner 不可见,因此无法在这里给大家分享它们的逻辑。
再回到 ST22。相信每一位 ABAP 程序员运行代码看到 ST22 的 dump 后,心里都会很沮丧。这个时候,如果有佛祖能够给引起 bug 的代码开开光,那将是一件很鼓舞人心的事情。
相信无论使用何种编程语言的程序员,看到下图红色高亮的这两行字,都会精神为之一振:

佛祖保佑,永无 bug
这段代码佛祖已经做过开光处理,绝无可能再产生 bug

如何实现 ST22 里这个显示效果?其实 ST22 和 Windows 系统蓝屏显示逻辑一样,都是一段静态模板文本加上运行时异常的实际动态内容合并而成。
模板文字存储在 ABAP Netweaver 服务器的数据库表里。我们只需要在 ST22 的框架代码把模板文本从数据库表读出之后,将佛祖开光的文本动态添加到模板文本的头部,就大功告成了。
实现步骤非常简单,在 ST22 标准程序 SAPMS380 的 subroutine read_snapt 内创建一个隐式增强。
从 read_snapt 的代码能看出 ST22 的模板文本是存储在数据库表 SNAPT 里的。

把佛祖开光的文本注入到 read_snapt 输出的头部:

这段隐式增强的代码我放在了我的 Github 上:
https://github.com/i042416/Kn…
最终效果就是每次出现了运行时程序执行错误后,程序员到 ST22 里查看 dump 时,总能看到“佛祖保佑,永无 BUG”几个字。
这个例子其实也再次体现了 Jerry 之前提到的,作为 ABAP 开发环境和运行环境和二而一的 Netweaver,给开发者提供了强大的可扩展性。
最后也是最重要的
1. 本文提供的步骤涉及到了对 ABAP 框架代码的隐式增强,请谨慎使用。禁止在测试服务器和生产服务器使用! 否则由此造成的一切负面后果,Jerry 本人及 SAP 概不负责。
2. 如果真的想确保自己交付的代码“永无 BUG”,程序员还是得老老实实练好自己的内功,而不要把自己的命运交给佛祖。毕竟国内这么多程序员,这么多行代码,要是每一位程序员每一行代码都要由佛祖开光,佛祖得多累鸭,佛祖忙不过来鸭!

更多阅读

动手使用 ABAP Channel 开发一些小工具,提升日常工作效率
聊聊 C 语言和 ABAP
ABAP vs Java,蛙泳 vs 自由泳
300 行 ABAP 代码实现一个最简单的区块链原型
Jerry 的 ABAP 原创技术文章合集
ABAP 开发人员未来应该学些什么
Jerry 的 ABAP, Java 和 JavaScript 乱炖
我用 ABAP 做过的那些无聊的事情
不喜欢 SAP GUI?那试试用 Eclipse 进行 ABAP 开发吧
那些年我用过的 SAP IDE
使用 Visual Studio Code 编写和激活 ABAP 代码

退出移动版