glibc 知:手册37:内部探测器

1. 前言

The GNU C Library Reference Manual for version 2.35

2. 内部探测

Internal probes

为了帮助调试和监视内部行为,GNU C 库公开了使用 libc 提供程序标记的几乎零开销的 SystemTap 探测。

这些探测不是 GNU C 库稳定 ABI 的一部分,它们可能会在不同版本中更改或删除。我们对它们的唯一承诺是,如果我们发现需要删除或修改探测的参数,修改后的探测将具有不同的名称,因此依赖于旧探测的程序监视器不会得到意外参数。

2.1. 内存分配探测

Memory Allocation Probes

这些探测被设计为在 GNU C 库的虚拟内存子系统中发出相对不寻常的情况。

探测:memory_sbrk_more (void *$arg1, size_t $arg2)

调用 sbrk 扩展主竞技场后触发此探测。参数 $arg1 是请求给 sbrk 的额外大小,$arg2 是标记 sbrk 区域结束的指针,响应请求而返回。

探测:memory_sbrk_less (void *$arg1, size_t $arg2)

通过调用 sbrk 减小主竞技场的大小后触发此探测。参数 $arg1 是 sbrk 释放的大小(正值,而不是传递给 sbrk 的负值),$arg2 是标记 sbrk 区域结束的指针,响应请求返回。

探测:memory_heap_new (void *$arg1, size_t $arg2)

在映射新堆后触发此探测。参数 $arg1 是指向内存区域基址的指针,其中保存了 heap_info 数据结构,$arg2 是堆的大小。

探测:memory_heap_free (void *$arg1, size_t $arg2)

在通过 munmap 完全删除堆之前触发此探测(与其他 sbrk 和堆探测不同)。参数 $arg1 是指向堆的指针,$arg2 是堆的大小。

探测:memory_heap_more (void *$arg1, size_t $arg2)

在扩展 mmaped 堆的尾随部分后触发此探测。参数 $arg1 是指向堆的指针,$arg2 是堆的新大小。

探测:memory_heap_less (void *$arg1, size_t $arg2)

在释放 mmaped 堆的尾随部分后触发此探测器。参数 $arg1 是指向堆的指针,$arg2 是堆的新大小。

探测:memory_malloc_retry (size_t $arg1)

探测:memory_realloc_retry (size_t $arg1, void *$arg2)

探测:memory_memalign_retry (size_t $arg1, size_t $arg2)

探测:memory_calloc_retry (size_t $arg1)

当相应的函数无法从正在使用的 arena 获取请求的内存量时,会触发这些探测器,然后再调用 arena_get_retry 来选择一个替代的 arena 来重试分配。参数 $arg1 是用户请求的内存量;在 calloc 的情况下,这是从两个函数参数计算的总大小。在 realloc 情况下,$arg2 是指向正在调整大小的内存区域的指针。在 memalign 的情况下,$arg2 是用于请求的对齐方式,它可能比传递给 memalign 函数的值更严格。函数 posix_memalign、valloc 和 pvalloc 也使用 memalign 探测。

请注意,参数顺序与相应的两个参数函数的顺序不匹配,因此在所有这些探测中,用户请求的分配大小都在 $arg1 中。

探测:memory_arena_retry (size_t $arg1, void *$arg2)

此探测在 arena_get_retry (调用该函数以选择在其中重试第一次尝试失败的分配的备用 arena)中触发,然后再选择备用 arena。这个探测是多余的,但当确定哪些内存分配函数在第一次尝试时分配失败并不重要时,它更容易使用。参数 $arg1 与函数特定探测中的相同,除了必须确保更严格对齐的函数引入的填充额外空间。参数 $arg2 是分配失败的区域。

探测:memory_arena_new (void *$arg1, size_t $arg2)

当 malloc 分配和初始化一个额外的 arena(不是主 arena)时,但在将 arena 分配给正在运行的线程或插入到 arena 的内部链表之前,会触发此探测。arena 的 malloc_state 内部数据结构位于 $arg1 处,在一个新分配的堆中,该堆大到足以容纳至少 $arg2 个字节。

探测:memory_arena_reuse (void *$arg1, void *$arg2)

当 malloc 刚刚选择要重用的现有 arena 并(临时)保留它以供独占使用时,将触发此探测。参数 $arg1 是指向新选择的 arena 的指针,而 $arg2 是指向该线程先前使用的 arena 的指针。

这发生在reused_arena 中,就在获取探测memory_arena_reuse_wait 中提到的互斥锁之后;参数 $arg1 将指向同一个竞技场。在这种配置中,这通常每个线程只会发生一次。例外情况是当一个线程首先选择了主区域,但随后的分配失败:然后,只有这样,我们才能切换到另一个区域来重试该分配,并在该线程中进行进一步的分配。

探测:memory_arena_reuse_wait (void *$arg1, void *$arg2, void *$arg3)

当 malloc 即将等待一个 arena 可供重用时,将触发此探测。参数 $arg1 持有指向线程将等待的互斥体的指针,$arg2 是指向要重用的新选择的 arena 的指针,$arg3 是指向该线程先前使用的 arena 的指针。

这发生在reused_arena中,当线程第一次尝试分配内存或在主arena分配失败后需要重试时,没有任何空闲arena,已达到最大arena数量,并且选择了现有arena用于重用,但无法立即获取其互斥体。$arg1 中的互斥锁是所选竞技场的互斥锁。

探测:memory_arena_reuse_free_list (void *$arg1)

当 malloc 在 get_free_list 函数中选择了空闲列表中供线程使用的竞技场时,将触发此探测。参数 $arg1 包含一个指向所选竞技场的指针。

探测:memory_mallopt (int $arg1, int $arg2)

在对参数进行任何更改之前,调用函数 mallopt 以更改 malloc 内部配置参数时会触发此探测。参数 $arg1 和 $arg2 是传递给 mallopt 函数的参数。

探测:memory_mallopt_mxfast (int $arg1, int $arg2)

当要更改的参数为 M_MXFAST 并且请求的值在可接受的范围内时,此探测会在 memory_mallopt 探测之后不久触发。参数 $arg1 是请求的值,$arg2 是这个 malloc 参数的前一个值。

探测:memory_mallopt_trim_threshold (int $arg1, int $arg2, int $arg3)

当要更改的参数为 M_TRIM_THRESHOLD 时,会在 memory_mallopt 探测之后不久触发此探测。参数 $arg1 是请求的值,$arg2 是此 malloc 参数的先前值,如果动态阈值调整已禁用,则 $arg3 非零。

探测:memory_mallopt_top_pad (int $arg1, int $arg2, int $arg3)

当要更改的参数为 M_TOP_PAD 时,此探测会在 memory_mallopt 探测之后不久触发。参数 $arg1 是请求的值,$arg2 是此 malloc 参数的先前值,如果动态阈值调整已禁用,则 $arg3 非零。

探测:memory_mallopt_mmap_threshold (int $arg1, int $arg2, int $arg3)

此探测在 memory_mallopt 探测之后不久触发,此时要更改的参数为 M_MMAP_THRESHOLD,并且请求的值在可接受的范围内。参数 $arg1 是请求的值,$arg2 是此 malloc 参数的先前值,如果动态阈值调整已禁用,则 $arg3 非零。

探测:memory_mallopt_mmap_max (int $arg1, int $arg2, int $arg3)

当要更改的参数为 M_MMAP_MAX 时,此探测在 memory_mallopt 探测之后不久触发。参数 $arg1 是请求的值,$arg2 是此 malloc 参数的先前值,如果动态阈值调整已禁用,则 $arg3 非零。

探测:memory_mallopt_perturb (int $arg1, int $arg2)

当要更改的参数为 M_PERTURB 时,此探测在 memory_mallopt 探测之后不久触发。参数 $arg1 是请求的值,$arg2 是这个 malloc 参数的前一个值。

探测:memory_mallopt_arena_test (int $arg1, int $arg2)

当要更改的参数是 M_ARENA_TEST 并且请求的值在可接受的范围内时,会在 memory_mallopt 探测之后不久触发此探测。参数 a r g 1 是 请 求 的 值 , arg1 是请求的值, arg1arg2 是这个 malloc 参数的前一个值。

探测:memory_mallopt_arena_max (int $arg1, int $arg2)

当要更改的参数为 M_ARENA_MAX 并且请求的值在可接受的范围内时,会在 memory_mallopt 探测之后不久触发此探测。参数 $arg1 是请求的值,$arg2 是这个 malloc 参数的前一个值。

探测:memory_mallopt_free_dyn_thresholds (int $arg1, int $arg2)

当函数 free 决定调整动态 brk/mmap 阈值时,将触发此探测。参数 $arg1 和 $arg2 分别是调整后的 mmap 和 trim 阈值。

探测:memory_tunable_tcache_max_bytes (int $arg1, int $arg2)

当设置了 glibc.malloc.tcache_max 可调参数时会触发此探测。参数 $arg1 是请求的值,$arg2 是此可调参数的先前值。

探测:memory_tunable_tcache_count (int $arg1, int $arg2)

当设置了 glibc.malloc.tcache_count 可调参数时会触发此探测。参数 $arg1 是请求的值,$arg2 是此可调参数的先前值。

探测:memory_tunable_tcache_unsorted_limit (int $arg1, int $arg2)

当设置了 glibc.malloc.tcache_unsorted_limit 可调参数时会触发此探测。参数 $arg1 是请求的值,$arg2 是此可调参数的先前值。

探测:memory_tcache_double_free (void *$arg1, int $arg2)

当 free 确定被释放的内存可能已经被释放并驻留在每个线程缓存中时,将触发此探测。请注意,由于分配的内存中剩余的随机有效负载数据与用于检测双重释放的密钥匹配,因此触发此探测的可能性极小。这个探测实际上表明已经发生了昂贵的 tcache 线性搜索,寻找双重释放。参数 $arg1 是传递给 free 的内存位置,参数 $arg2 是它所在的 tcache bin。

2.2. 非本地 Goto 探测

Non-local Goto Probes

这些探测器用于向 setjmp、sigsetjmp、longjmp 或 siglongjmp 发出调用信号。

探测:setjmp (void *$arg1, int $arg2, void *$arg3)

每当调用 setjmp 或 sigsetjmp 时都会触发此探测。参数 $arg1 是指向作为 setjmp 或 sigsetjmp 的第一个参数传递的 jmp_buf 的指针,$arg2 是 sigsetjmp 的第二个参数,如果这是对 setjmp 的调用,则为零,$arg3 是指向将被存储的返回地址的指针在 jmp_buf 中。

探测:longjmp (void *$arg1, int $arg2, void *$arg3)

每当调用 longjmp 或 siglongjmp 时都会触发此探测。参数 $arg1 是指向作为 longjmp 或 siglongjmp 的第一个参数传递的 jmp_buf 的指针,$arg2 是作为 longjmp 或 siglongjmp 的第二个参数传递的返回值,$arg3 是指向 longjmp 或 siglongjmp 将返回的返回地址的指针.

longjmp 探测在寄存器尚未恢复到 jmp_buf 中的值时触发,展开将显示一个调用堆栈,包括 longjmp 或 siglongjmp 的调用者。

探测:longjmp_target (void *$arg1, int $arg2, void *$arg3)

此探测在与 longjmp 探测相同的条件和相同的参数下触发。

longjmp_target 探测在寄存器已恢复为 jmp_buf 中的值的点触发,展开将显示一个调用堆栈,包括 setjmp 或 sigsetjmp 的调用者。

3. 参考

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值