鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

多进程报告解析

在对多进程应用进行内存一致性动态检查时,最终结果报告会过滤系统库(如.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行对同一地址存在竞态访问,用户需对这两行源码进行检查,是否真的存在进程间冲突。