官方虽然有不少资料, 但是都很分散, 我整理一下关于rk3568的测试资料, 方便大家参考.

系统编译

  1. 参照搭建开发环境 准备好Ubuntu环境和windows的vscode环境, 完成remote-ssh连接.

  2. 准备好源码, 参考创建OpenHarmony工程章节, 自动获取源码, 或者导入自己存在的源码.

    可以从此处获取源码

  3. 对于rk3568设备, 参考编译RK3568开发板源码章节的1,2,3的内容. 准备好后, 参考HiHope_DAYU200/开发环境搭建编译指南, 安装需要的组件, 如下:

    1
    2
    3
    4
    5
    sudo apt-get install binutils git git-lfs gnupg flex
    bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib
    libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache
    libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8
    python3-pip ruby libtinfo-dev libtinfo5

    如果安装有问题, 可以考虑使用aptitude来解决.

  4. 最后可以执行./build.sh --product-name rk3568 --target-cpu arm64 --ccache编译64位系统.

rk3568系统烧录

参考 烧录指导文档

  1. 按照如图所示连接电源线, 串口线, usb线

    image-20220516164155093

  2. 下载驱动工具

    需要下载的文件: DriverAssitant_v5.1.1.zip, RKDevTool.exe, config.ini, Language 目录.

    一定要保留Language目录, 否则工具会出现点一下就崩溃或者一直static的状况.

    解压DriverAssitant_v5.1.1.zip后, 运行DriverAssitant\DriverInstall.exe , 点击驱动安装.

  3. 打开RKDevTool.exe 烧写工具, 查看设备状态.

    如果开着机, 默认是如下状态:

    1672023200456

  4. 按住下图所示两个键

    image-20220516170351601

    烧录工具会提示没发现设备.

    然后松开reset键, 显示”发现一个loader设备”. 然后松开剩下的按键. 等待3秒.

使用烧录工具烧录

vscode烧录时, 传输文件会比scp命令慢, 我们可以手动烧录.

将ubuntu目录源码的out/rk3568/packages/phone/images/目录下的所有文件拷贝到本地, 然后在RKDevTool.exe 工具的栏目里右键选择load config, 加载目录里的config.cfg文件, 并修改好每个文件的路径. 点击执行烧录.

使用vscode工具烧录

  1. 确保机器连接成功

    在DevEco Device Tool中,选择REMOTE DEVELOPMENT > Local PC,查看远程计算机(Ubuntu开发环境)与本地计算机(Windows开发环境)的连接状态。

    • 如果Local PC右边连接按钮为img则远程计算机与本地计算机为已连接状态,不需要执行其他操作。
    • 如果Local PC右边连接按钮为img则点击绿色按钮进行连接。连接时DevEco Device Tool会重启服务,因此请不要在下载源码或源码编译过程中进行连接,否则会中断任务
  2. 在vs code中点击upload选项即可烧录.img

  3. vscode会先拷贝文件到本地, 拷贝完成后, 会提示按键开始烧录

创建应用调试

  1. 下载安装HUAWEI DevEco Studio

  2. 启动它, 一步步继续就行, 然后会强制安装Harmony SDK, 继续

  3. 创建OpenHarmony 应用

    1670580451653

  4. 接着会提示你安装OpenHarmony SDK, 安装即可

    1670580505134

  5. 项目就创建完成了, 如果设备连接正常, 此处会有显示

    1670580590649

  6. 选择File->Project Structure, 按下图所示

    1670580692357

    先择自动签名.

  7. 完成后就可以在下图位置开始调试和测试运行了

    1670580744213

参考: DevEco Studio 搭建

设置应用权限

应用一般有3个等级:

APL级别 说明
system_core等级 该等级的应用服务提供操作系统核心能力。
system_basic等级 该等级的应用服务提供系统基础服务。
normal等级 普通应用。

可以查看此处的权限列表来确认模块所需的权限. (华为的人老是乱改链接, 如果失效了, 就搜索)

如果我们需要一个高一点的权限, 比如说 system_basic, 那么就需要额外的操作设置一下. 下面示例设置ohos.permission.DISTRIBUTED_SOFTBUS_CENTER 权限

  1. 创建一个空的Openharmony项目, 在项目的 entry/src/main下, 找到 module.json5 文件

    1675148476629

  2. 在文件的 module 的大括号内添加如下权限请求:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    {  
    "module": {
    xxx: [
    ...
    ],
    "requestPermissions": [// 新增此项
    {
    "name": "ohos.permission.DISTRIBUTED_SOFTBUS_CENTER"// 需要的权限
    }
    ]
    }
    }

    更多设置参考

  3. 找到 UnsgnedReleasedProfileTemplate.json 文件, 默认在C:\Users\vv\AppData\Local\OpenHarmony\Sdk\9\toolchains\lib\UnsgnedReleasedProfileTemplate.json, 修改其中的内容:

    1
    2
    "apl":"system_basic",// 根据权限列表的内容, DISTRIBUTED_SOFTBUS_CENTER 需要 system_basic权限
    "app-feature":"hos_system_app" // 系统基础服务app

    更多设置参考

  4. 然后找到默认的签名证书, C:\Users\vv\.ohos\config\openharmony, 把目录下以auto_ohos_default_你的项目名称...开头的文件都删除. 同时清理项目的build-profile.json5signingConfigs的内容为 "signingConfigs":[],

  5. 在DevEco里, File -> Project Structure->Project->Signing Configs里设置自动签名.

    1675149053919

  6. 最后编译好就可以直接安装测试了.

测试用例的生成

使用DevEco生成测试用例

这里需要感谢k0shl(@KeyZ3r0)大佬的帮助, 找到了ipc的直接调用方法:

文件xxx.ets里:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import rpc from '@ohos.rpc'

@Entry
@Component
struct Index {
@State message: string = 'ipc Test'
@State result: string = 'type to start'
@State button: string = 'Start'

build() {
Row() {
Column() {
Text(this.message)
.fontSize(40)
.fontWeight(FontWeight.Bold)

Text(this.result)
.fontSize(20)
.fontColor(Color.Red)
.fontWeight(FontWeight.Bold)

Button(this.button)
.fontSize(40)
.fontWeight(FontWeight.Bold)
.onClick(() => {
let proxy = rpc.IPCSkeleton.getContextObject();//初始化一个local register service的IRemoteObject
if (proxy == null) {
this.result = "connect error";
return
}
let data = rpc.MessageParcel.create();
data.writeInterfaceToken("ohos.samgr.accessToken"); //固定值,是samgr的interface token
data.writeInt(3503); //想往哪个service发IPC消息,设定这个值,一般这个值在对应服务的头文件里, 比如软总线就是 SOFTBUS_SERVER_SA_ID_INNER 4700
data.writeBoolean(false); //默认为false
let reply = rpc.MessageParcel.create();
let opt = new rpc.MessageOption();
proxy.sendRequestAsync(2, data, reply, opt) //首先发送CheckSystemAbility到samgr
.then(value => {
if(value.errCode != 0){
this.result = "send request failed. errcode: " + value.errCode
return
}
let atproxy = reply.readRemoteObject(); //若成功,返回的MessageParcel reply会包含目标服务的IRemoteObject
let atdata = rpc.MessageParcel.create();
let atreply = rpc.MessageParcel.create();
atdata.writeInterfaceToken("test"); //构造目标服务想测试的interface的MessageParcel, 具体参考目标服务如何解析的数据
atdata.writeInt(0xdeadbeef);
atdata.writeString("test");
this.result = "finish1"
let atopt = new rpc.MessageOption();
atproxy.sendRequestAsync(0xff10, atdata, atreply, atopt).then(result => { //发送测试数据给目标服务,SendRequest的第一个参数为目标服务的接口,
//是一个enumerate,可以从目标服务目录的头文件里找到,
//比如/home/user/Desktop/code-v3.2-Beta4/OpenHarmony/base/security/access_token/frameworks/accesstoken/include/i_accesstoken_manager.h
//路径里的enum class InterfaceCode
this.result = "finish222"
if(result.errCode == 0){
this.result = "finish all"
return
}
})
}).catch(function(e){
this.result = "catch exception. error:" + e;
return
});
})
}
.width('100%')
}
.width('100%')
}
}

上述示例实现了一个 ipc 消息发送操作.

截止 2023/1/31, Openharmony的sdk里, MessageParcel接口不支持writeCString. 如果需要写入字符串, 可以考虑用 writeInt 替代, 因为写入字符串也是4字节对齐的, 而CString的方式相当于写Int.

使用原始测试组件生成测试用例

OpenHarmony自带google test, 如果要测试, 也可以通过修改自带的测试用例来实现我们的需求.

  1. OpenHarmony/foundation/communication/dsoftbus/tests/BUILD.gn添加新的测试用例

    1
    2
    3
    4
    5
    6
    features += [
    "sdk/discovery/unittest:DiscSdkTest",// 这个默认就有
    "sdk/transmission/trans_channel:TransSdkTest",
    "adapter/unittest:AdapterTest",
    "sdk/bus_center/unittest:BusCenterSdkTest",// 如果我添加这个, 后面生成的命令就需要换成 ./build.sh --product-name rk3568 --build-target BusCenterSdkTest
    ]

    测试用例所在目录的build.gn的解读:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    bus_center_sdk_test_src = [ "bus_center_sdk_test.cpp" ]// 源码文件之一
    ...
    ohos_unittest("BusCenterSdkTest") {// 添加用例的名称
    module_out_path = module_output_path
    sources = bus_center_sdk_test_src// 涉及到的源码文件
    include_dirs = bus_center_sdk_test_inc
    include_dirs += [
    "unittest/common/",
    "//utils/native/base/include",
    ]
    ...
    }
  2. 使用./build.sh --product-name rk3568 --build-target DiscSdkTest --target-cpu arm64 --ccache 生成测试用例

    生成位置OpenHarmony/out/rk3568/tests/unittest/dsoftbus/discovery/DiscSdkTest(此版本是stripped的版本, 但是有函数名称, 如果没有, 说明IDA版本过低)

    为了方便调试, 可以在OpenHarmony/out/rk3568/exe.unstripped/tests/unittest/dsoftbus/discovery/DiscSdkTest 位置找到not stripped的版本.

调试器调试

64位系统的调试

gdb-static下载gdbserver, 然后在ubuntu编译一个支持aarch64的gdb.

1
2
3
4
5
6
7
$ apt-get install python-dev
$ mkdir build
$ mkdir out
$ cd build
$ ../configure --build=x86_64-pc-linux-gnu -target=aarch64-linux-gnu --prefix=/home/vv/gdb-8.2.1/out --with-python
$ make
$ make install

在机器上操作连接wifi网络, 使用gdbserver启动程序

1
$ ./gdbserver-8.3.1-aarch64-le 192.168.1.4:1234 ./BusCenterSdkTest

在Ubuntu使用编译的gdb连接程序:

1
$ ./aarch64-linux-gnu-gdb

为了方便调试, 可以使用文末的gdb脚本.

32位系统的调试(不建议, 可以忽略此节)

尝试过使用编译的gdb调试(参考编译gdb), 但是rk3568的32位版本的内核实现有点问题, 会在某些syscall调用中失败. 因此建议使用lldb调试. OpenHarmony SDK会带lldb调试器, C:\Users\xx\AppData\Local\OpenHarmony\Sdk\9\native\llvm\lib\clang\12.0.1\bin\arm-linux-ohos\lldb-server(它也有64位的)

点击此处下载

  1. 获取hdc_std工具, 可以网上下载, 安装了SDK也会自带C:\Users\vv\AppData\Local\OpenHarmony\Sdk\9\toolchains\hdc_std.exe.

  2. 传递lldb

    1
    2
    3
    4
    5
    6
    7
    8
    9
    > .\hdc_std.exe list targets 查看设备
    7001005458323933328a268f9c7f3900
    > .\hdc_std.exe file send D:\lldb-server /data 将本地文件传递到设备的/data目录
    FileTransfer finish, Size:xxx, File count = 1, time:16ms rate:1245.38kB/s
    > .\hdc_std.exe shell 进入设备shell
    # cd /data 进入/data目录
    # mkdir test 新建目录便于测试
    # chmod +x ./lldb_server
    # ./lldb-server platform --listen "*:1234" --server 前提是设备的wifi有连接
  3. 使用C:\Users\vv\AppData\Local\OpenHarmony\Sdk\9\native\llvm\bin\lldb.exe或者Ubuntu的lldb连接目标server

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    > .\lldb.exe --arch thumbv7
    (lldb) platform select remote-linux
    Platform: remote-linux
    Connected: no
    (lldb) platform connect connect://192.168.1.8:1234
    Platform: remote-freebsd
    Triple: arm-unknown-linux-unknown
    OS Version: 5.10.93 (5.10.93)
    Hostname: localhost
    Connected: yes
    WorkingDir: /
    Kernel: #1 SMP Wed Dec 7 15:20:41 CST 2022
    (lldb) platform set -w /data/test 设置测试目录为我们刚创建的test目录
    (lldb) file ./DiscSdkTest 执行run的时候会将本地文件DiscSdkTest放置到目标目录
    (lldb) run 开始运行

    目前32位的系统的lldb存在thumb识别问题, 调试会有很大问题.

gdbinit for aarch64

因为自带的gdb比较简单, 这里我生成一个gdbinit, 方便查看内存和寄存器, 以及单步.

使用时, 在~/.gdbinit添加以下内容即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
set architecture aarch64
set $64BITS=1
set $ARM=1
set $SHOW_CONTEXT=1
define ascii_char
if $argc != 1
help ascii_char
else
# thanks elaine :)
set $_c = *(unsigned char *)($arg0)
if ($_c < 0x20 || $_c > 0x7E)
printf "."
else
printf "%c", $_c
end
end
end
document ascii_char
Print ASCII value of byte at address ADDR.
Print "." if the value is unprintable.
Usage: ascii_char ADDR
end


define hex_quad
if $argc != 1
help hex_quad
else
printf "%02X %02X %02X %02X %02X %02X %02X %02X", \
*((unsigned char*)$arg0), *((unsigned char*)$arg0 + 1), \
*((unsigned char*)$arg0 + 2), *((unsigned char*)$arg0 + 3), \
*((unsigned char*)$arg0 + 4), *((unsigned char*)$arg0 + 5), \
*((unsigned char*)$arg0 + 6), *((unsigned char*)$arg0 + 7)
end
end
document hex_quad
Print eight hexadecimal bytes starting at address ADDR.
Usage: hex_quad ADDR
end

define hex_dword
if $argc != 1
help hex_dword
else
printf "0x%08X 0x%08X 0x%08X 0x%08X", \
*(unsigned int*)($arg0), *(unsigned int*)((char*)$arg0 + 4), \
*(unsigned int*)((char*)$arg0 + 8), *(unsigned int*)((char*)$arg0 + 0xc)
end
end
document hex_dword
Print eight hexadecimal bytes starting at address ADDR.
Usage: hex_dword ADDR
end

define hex_qword
if $argc != 1
help hex_qword
else
printf "0x%016llX 0x%016llX", \
*(unsigned long long*)($arg0), *(unsigned long long*)((char*)$arg0 + 8)
end
end
document hex_qword
Print eight hexadecimal bytes starting at address ADDR.
Usage: hex_qword ADDR
end

define hexdump
if $argc != 1
help hexdump
else
echo \033[1m
if ($64BITS == 1)
printf "0x%016lX : ", $arg0
else
printf "0x%08X : ", $arg0
end
echo \033[0m
hex_quad $arg0
echo \033[1m
printf " - "
echo \033[0m
hex_quad $arg0+8
printf " "
echo \033[1m
ascii_char (char*)$arg0+0x0
ascii_char (char*)$arg0+0x1
ascii_char (char*)$arg0+0x2
ascii_char (char*)$arg0+0x3
ascii_char (char*)$arg0+0x4
ascii_char (char*)$arg0+0x5
ascii_char (char*)$arg0+0x6
ascii_char (char*)$arg0+0x7
ascii_char (char*)$arg0+0x8
ascii_char (char*)$arg0+0x9
ascii_char (char*)$arg0+0xA
ascii_char (char*)$arg0+0xB
ascii_char (char*)$arg0+0xC
ascii_char (char*)$arg0+0xD
ascii_char (char*)$arg0+0xE
ascii_char (char*)$arg0+0xF
echo \033[0m
printf "\n"
end
end
document hexdump
Display a 16-byte hex/ASCII dump of memory at address ADDR.
Usage: hexdump ADDR
end

define hexDwordDump
if $argc != 1
help hexDwordDump
else
echo \033[1m
if ($64BITS == 1)
printf "0x%016lX : ", $arg0
else
printf "0x%08X : ", $arg0
end
echo \033[0m
hex_dword $arg0
printf " "
echo \033[1m
ascii_char (char*)$arg0+0x0
ascii_char (char*)$arg0+0x1
ascii_char (char*)$arg0+0x2
ascii_char (char*)$arg0+0x3
ascii_char (char*)$arg0+0x4
ascii_char (char*)$arg0+0x5
ascii_char (char*)$arg0+0x6
ascii_char (char*)$arg0+0x7
ascii_char (char*)$arg0+0x8
ascii_char (char*)$arg0+0x9
ascii_char (char*)$arg0+0xA
ascii_char (char*)$arg0+0xB
ascii_char (char*)$arg0+0xC
ascii_char (char*)$arg0+0xD
ascii_char (char*)$arg0+0xE
ascii_char (char*)$arg0+0xF
echo \033[0m
printf "\n"
end
end
document hexDwordDump
Display a 16-byte hex/ASCII dump of memory at address ADDR.
Usage: hexDwordDump ADDR
end

define hexQwordDump
if $argc != 1
help hexQwordDump
else
echo \033[1m
if ($64BITS == 1)
printf "0x%016lX : ", $arg0
else
printf "0x%08X : ", $arg0
end
echo \033[0m
hex_qword $arg0
printf " "
echo \033[1m
ascii_char (char*)$arg0+0x0
ascii_char (char*)$arg0+0x1
ascii_char (char*)$arg0+0x2
ascii_char (char*)$arg0+0x3
ascii_char (char*)$arg0+0x4
ascii_char (char*)$arg0+0x5
ascii_char (char*)$arg0+0x6
ascii_char (char*)$arg0+0x7
ascii_char (char*)$arg0+0x8
ascii_char (char*)$arg0+0x9
ascii_char (char*)$arg0+0xA
ascii_char (char*)$arg0+0xB
ascii_char (char*)$arg0+0xC
ascii_char (char*)$arg0+0xD
ascii_char (char*)$arg0+0xE
ascii_char (char*)$arg0+0xF
echo \033[0m
printf "\n"
end
end
document hexQwordDump
Display a 16-byte hex/ASCII dump of memory at address ADDR.
Usage: hexQwordDump ADDR
end


# _______________data window__________________
define ddump
if $argc != 2
help ddump
else
echo \033[34m
if $ARM == 1
printf "[0x%08X]", $data_addr
else
if ($64BITS == 1)
printf "[0x%04X:0x%016lX]", $ds, $data_addr
else
printf "[0x%04X:0x%08X]", $ds, $data_addr
end
end
echo \033[34m
printf "------------------------"
printf "-------------------------------"
if ($64BITS == 1)
printf "-------------------------------------"
end

echo \033[1;34m
printf "[data]\n"
echo \033[0m
set $_count = 0
while ($_count < $arg1)
set $_i = ($_count * 0x10)
if $arg0 == 1
hexdump $data_addr+$_i
end
if $arg0 == 2
hexDwordDump $data_addr+$_i
end
if $arg0 == 3
hexQwordDump $data_addr+$_i
end
set $_count++
end
end
end
document ddump
Display NUM lines of hexdump for address in $data_addr global variable.
Usage: ddump TYPE NUM
end


define db
if($argc != 1 && $argc != 2)
help db
else
set $data_addr = (char*)$arg0
if($argc == 1)
ddump 1 5
else
ddump 1 $arg1
end
end
end
document db
Display 16 lines of a hex dump of address starting at ADDR.
Usage: db ADDR LINE
end

define dd
if($argc != 1 && $argc != 2)
help dd
else
set $data_addr = (char*)$arg0
if($argc == 1)
ddump 2 5
else
ddump 2 $arg1
end
end
end
document dd
Display 16 lines of a hex dump of address starting at ADDR.
Usage: dd ADDR LINE
end

define dq
if($argc != 1 && $argc != 2)
help dq
else
set $data_addr = (char*)$arg0
if($argc == 1)
ddump 3 8
else
ddump 3 $arg1
end
end
end
document dq
Display 16 lines of a hex dump of address starting at ADDR.
Usage: dq ADDR LINE
end

define reg
printf " "
echo \033[32m
printf "$x0:"
echo \033[0m
printf " 0x%016lX ", $x0
echo \033[32m
printf "$x1:"
echo \033[0m
printf " 0x%016lX ", $x1
echo \033[32m
printf "$x2:"
echo \033[0m
printf " 0x%016lX ", $x2
echo \033[32m
printf "$x3:"
echo \033[0m
printf " 0x%016lX ", $x3
echo \033[32m
echo \n
printf "$x4:"
echo \033[0m
printf " 0x%016lX ", $x4
echo \033[32m
printf "$x5:"
echo \033[0m
printf " 0x%016lX ", $x5
echo \033[32m
printf "$x6:"
echo \033[0m
printf " 0x%016lX ", $x6
echo \033[32m
printf "$x7:"
echo \033[0m
printf " 0x%016lX ", $x7
echo \033[32m
echo \n
printf "$x8:"
echo \033[0m
printf " 0x%016lX ", $x8
echo \033[32m
printf "$x9:"
echo \033[0m
printf " 0x%016lX ", $x9
echo \033[32m
printf "$x10:"
echo \033[0m
printf " 0x%016lX ", $x10
echo \033[32m
printf "$x11:"
echo \033[0m
printf " 0x%016lX ", $x11
echo \033[32m
echo \n
printf "$x12:"
echo \033[0m
printf " 0x%016lX ", $x12
echo \033[32m
printf "$x13:"
echo \033[0m
printf " 0x%016lX ", $x13
echo \033[32m
printf "$x14:"
echo \033[0m
printf " 0x%016lX ", $x14
echo \033[32m
printf "$x15:"
echo \033[0m
printf " 0x%016lX ", $x15
echo \033[32m
echo \n
printf "$x16:"
echo \033[0m
printf " 0x%016lX ", $x16
echo \033[32m
printf "$x17:"
echo \033[0m
printf " 0x%016lX ", $x17
echo \033[32m
printf "$x18:"
echo \033[0m
printf " 0x%016lX ", $x18
echo \033[32m
printf "$x19:"
echo \033[0m
printf " 0x%016lX ", $x19
echo \033[32m
echo \n
printf "$x20:"
echo \033[0m
printf " 0x%016lX ", $x20
echo \033[32m
printf "$x21:"
echo \033[0m
printf " 0x%016lX ", $x21
echo \033[32m
printf "$x22:"
echo \033[0m
printf " 0x%016lX ", $x22
echo \033[32m
printf "$x23:"
echo \033[0m
printf " 0x%016lX ", $x23
echo \033[32m
echo \n
printf "$x24:"
echo \033[0m
printf " 0x%016lX ", $x24
echo \033[32m
printf "$x25:"
echo \033[0m
printf " 0x%016lX ", $x25
echo \033[32m
printf "$x26:"
echo \033[0m
printf " 0x%016lX ", $x26
echo \033[32m
printf "$x27:"
echo \033[0m
printf " 0x%016lX ", $x27
echo \033[32m
echo \n
printf "$x28:"
echo \033[0m
printf " 0x%016lX ", $x28
echo \033[32m
printf "$x29:"
echo \033[0m
printf " 0x%016lX ", $x29
echo \033[32m
printf "$x30:"
echo \033[0m
printf " 0x%016lX ", $x30
echo \033[32m
echo \n
printf "$sp:"
echo \033[0m
printf " 0x%016lX ", $sp
echo \033[32m
printf "$pc:"
echo \033[0m
printf " 0x%016lX ", $pc
echo \033[0m
echo \n
end

define context
reg
x/8i $pc
dq $sp 3
end



define hook-stop
# this makes 'context' be called at every BP/step
if ($SHOW_CONTEXT > 0)
context
end
end
document hook-stop
!!! FOR INTERNAL USE ONLY - DO NOT CALL !!!
end