编程技巧的第三讲,麦先生打算给大家介绍一下 PARADISE 序列编程环境里,非常重要的 debug 功能。
PARADISE 序列编程环境全称为Philips Advanced Research And Development Integrated Sequence programming Environment。我们一般将其简称为 PPE (Pulse Programming Environment)。
用过 PARADISE 编程环境的同学们可能比较清楚, PARADISE 软件版本从5.1升级到5.3之后,一个重大的变化是, Goal C 语言升级成了 Goal C++,同时在 Method 代码中引入了 Visual Studio Solution。因此,在5.3之后的版本里,我们可以使用一些 VS 自带的 feature。本讲涉及到的一个重要的 feature 就是 VS 自带的 debug 功能,其他功能可能会在后面的文章中进行介绍。
注: 如果大家有其他的感兴趣内容,也可以在文章后面或者公众号后台留言,麦先生会挑选一些有意思的话题和大家一起研究。
本讲主要内容:
1.Debug 功能与 Attach to Process
2.如何在 PPE 中 debug Method 代码
▌Debug 功能与 Attach to Process
相信大部分会编程的同学们都知道,如何在一个程序里面插入断点,如何单步运行程序,如何实时查看变量的值等。一个典型的 debug 过程如下图所示。
以上操作通常适用于编写好的单个简单程序(.exe 文件)。那么如果我们编写的是一个无法直接执行的文件(如 dll 文件或者 MATLAB 里面的 mex 文件),该如何进行 debug 工作呢?
这个时候就需要使用到 VS Debug -> Attach to Process 功能了。
以下以 debug 一个写好的MATLABMex 文件为例。
首先在MATLAB中使用 “mex –g source.cpp” 命令,生成带调试信息,未进行优化过的二进制执行文件(此时生成两个文件,后缀分别为 .mexw64 和 .pdb)。这一步不懂的同学可以自行 google 或者使用MATLAB的 “doc mex” 命令查看帮助文档。
下图显示了麦先生编写的一个简单的,用于交换数组值的 mex 程序,以及调用它的MATLAB代码。
运行该程序,可以得到如下结果,证明 mex 程序运行成功。
那么我们该如何对这个 mex 程序进行 debug 呢?
首先在 VS 代码里点击 Debug -> Attach to Process。
然后在跳出来的窗口里选择需要附加到MATLAB.exe 这个进程上。
这个时候插入断点,然后运行MATLAB程序,就会自动跳转到设置的断点上。
这个时候就可以使用单步运行等调试功能了。
▌如何在 PPE 中 debug Method 代码
在 debug Method 代码之前,我们需要进行一些准备工作。
首先,找到 "G:\Ppe\Tools\Build_Tools\Patch.pm" 这个文件(这个文件是Build and Patch 的时候用到的脚本文件),将其用 NotePad++ 打开,在所有my_copy ("******", $gyro_patch);后面添加一行my_copy ("$binary_dir\\*.pdb", $gyro_patch);。这样就可以将所有 dll 以及 exe 对应的 pdb 文件都拷贝到 G:\Patch 目录下,方便后面的 debug 工作。
修改完上述脚本文件后,重新 Build and Patch 一次,这次 patch 完就可以在 G:\Patch 下面看到拷贝过来的所有 pdb 文件了。
前面提到过, PPE 中 Methods 代码使用了 VS Solution (存在于 "G:\Ppe\RX_X_X_SWIDXX\system\PPE.sln" 这个位置)。打开这个 Solution,然后打开我们需要debug的文件内容(例如 mpiffe.cpp)。在需要 debug 的地方插入断点。
这个时候就可以启动模拟扫描软件了(注意,这个过程一定要在 Build and Patch之后完成,否则 Patch 是不会生效的)。
启动完成后,就可以新建病人,然后拖一个扫描卡片到扫描区,这个卡片使用的序列需要与我们 debug 的代码有关,例如我们需要 debug FFE 的代码,就需要拖一个 FFE 的序列过来,而不应该使用 TSE 的序列。
将这个卡片修改成我们需要的序列,然后点击 Accept。
这个时候,回到 Visual Studio 里面,依次点击 Debug->Attach to Process,回到下面的这个界面上,选择 Native,然后选择 attach 到哪个进程上。
如果是 debug PDF 部分的代码,那么应当 attach to examcards_win_cs.exe,如果是 debug MPF 部分的代码,那么应当 attach to scannersim.exe。成功 attach 之后,可以看到,代码左边插入的断点应当是实心的,如果是空心圆,那么可能是因为没有成功 load pdb 文件,需要检查 pdb 是否正确拷贝到 patch 文件夹下了。
此时,回到模拟扫描界面,双击需要修改的卡片,程序会自动跳转到当前设置的断点处,此时就可以进行后续的 debug 工作了(这是因为,每次修改扫描卡片,都会重新触发一个完整的 PDF 循环)。
如果 debug 的是 MPF 部分,那么双击修改扫描卡片的时候并不会跳转到断点处,因为目前只执行了PDF代码,断点处MPF代码还没有执行。这个时候需要在模拟扫描界面,点击 Start Scan 开始扫描,才会跳转到MPF代码里的断点处。
此时,点击 Stack Frame (上图红框内)可以查看当前 PDF 代码里面的函数嵌套关系,仔细研究这个层级调用关系,也有助于我们理解 PDF 代码(以及MPF代码)逻辑。
▌小结
本讲主要介绍了如何在 PPE 中使用 VS 自带的 debug 功能, debug 我们的 PDF 和 MPF 代码。读者可以自行尝试 debug 一下 MPF 代码,以及 debugMATLABmex 代码。这部分功能并不是 PPE 特有的,而是 VS 自带的 feature。因此如果有使用方面的疑问,除了留言外,也可以尝试 google 解决。
领取专属 10元无门槛券
私享最新 技术干货