多进程报告解析
在对多进程应用进行内存一致性动态检查时,最终结果报告会过滤系统库(如.so文件)等内容,可能导致部分数据竞争(race)漏报。如需进一步确认,用户可前往DevKit命令行亲和分析工具(advisor)所在路径的“mp_report_时间戳”文件夹下,查看对应的memtracer_mp_report原始报告进行参考。
以如下报告为例:
================== race detected: WRITE after READ shared memory type: POSIX resource: /dev/shm/myposixshm (shared memory file) var address=0x0 1) READ pid=2421880, tid=2421880 [unknown] bt#0 offset=0x94ad0 function: strnlen module: /usr/lib64/libc.so.6 source: [unknown] bt#1 offset=0x94e34 function: strncpy module: /usr/lib64/libc.so.6 source: [unknown] bt#2 offset=0xfc30 function: __tls_get_addr module: /usr/lib/ld-linux-aarch64.so.1 source: [unknown] bt#3 offset=0x400ee8 function: main module: /home/testdemo/memtracer_multiprocess_demo/multiprocess_demo/child_child/no_sync/posix source: /home/testdemo/memtracer_multiprocess_demo/multiprocess_demo/child_child/no_sync/posix.c:88 CONFLICTS WITH 2) WRITE pid=2421879, tid=2421879 [unknown] bt#0 offset=0x77238 function: vscanf module: /usr/lib64/libc.so.6 source: [unknown] bt#1 offset=0x52c90 function: snprintf module: /usr/lib64/libc.so.6 source: [unknown] bt#2 offset=0xfc30 function: __tls_get_addr module: /usr/lib/ld-linux-aarch64.so.1 source: [unknown] bt#3 offset=0x400dc0 function: main module: /home/testdemo/memtracer_multiprocess_demo/multiprocess_demo/child_child/no_sync/posix source: /home/testdemo/memtracer_multiprocess_demo/multiprocess_demo/child_child/no_sync/posix.c:60
报告共包含以下内容:
- race detected:表示检测到的竞态类型。
- WRITE after READ:表示存在“读操作后发生写操作”的竞态场景。
- READ after WRITE:表示存在“写操作后发生读操作”的竞态场景。
- WRITE after WRITE:表示存在“写操作后发生写操作”的竞态场景。
- shared memory type:表示竞态发生的共享内存资源类型(如POSIX类型)。
- resource:表示发生竞态的具体共享内存文件路径(如“/dev/shm/myposixshm”)。
- var address:表示发生竞态的内存地址,该地址指向共享内存的起始位置。
竞态访问主体信息解读:
报告主体会分条目列出对同一内存地址的两次竞态访问详情,每条访问信息包含以下内容:
- 操作类型:明确该次访问的行为是READ(读操作)或WRITE(写操作)。
- 进程和线程标识:展示执行该操作的进程ID(pid)与线程ID(tid)。
- 调用栈(Call Stack):按“从下往上”的顺序呈现代码执行路径,包含三个核心维度:
- function:该次访问对应的函数名称。
- module:函数所在的库文件或可执行文件路径。
- source:函数对应的源代码文件及具体行号。
以上述文本为例,posix.c文件第60行与posix.c第88行对同一地址存在竞态访问,用户需对这两行源码进行检查,是否真的存在进程间冲突。
父主题: 常用操作