gpt4 book ai didi

c - 如何知道任何库函数(中止)调用是否在源代码中多次使用?

转载 作者:太空宇宙 更新时间:2023-11-04 03:34:38 25 4
gpt4 key购买 nike

在下面的示例代码中,我们在不同条件下总共有四个中止调用,但是当我们使用优化标志 (-O3) 进行编译时,我们只能看到一个中止调用的调试信息。因此,在这四个中止调用中发生崩溃的地方,gdb 总是给出具有调试信息的调用。

#include <stdio.h>
#include <stdlib.h>

void level_aa(int a)
{
if (a == 0)
abort();
if (a == 1)
abort();
if (a == 2)
abort();

abort();
}

int main(int argc,char *argv[])
{ int D;
D = atoi(argv[1]);
printf(" Value = %d", D);
level_aa(D);
return 0;
}

用优化标志(-O3)编译上面的代码并用gdb运行

>gcc -g -O3 abort_crash.c -o abort
>gdb ./abort
(gdb)run 1
(gdb) bt
#0 0x00007ffff7ab2945 in *__GI_raise (sig=<optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
#1 0x00007ffff7ab3f21 in *__GI_abort () at abort.c:92
#2 0x0000000000400634 in level_aa (a=<optimized out>) at abort_crash.c:13
#3 main (argc=<optimized out>, argv=<optimized out>) at abort_crash.c:20
(gdb)

如果我们观察第 2 帧(#2),崩溃实际上发生在第 9 行,但 gdb 显示第 13 行。我可以理解它的发生是因为源代码的优化。因为如果它被多次使用,那么 gdb backtrace 中显示的行号可能不正确。是否可以通过不查看源代码来知道是否多次使用 abort 调用?如果我们知道调用不止一次被使用并且也被优化,那么我们可以打印一条警告消息。我们是工具(内部使用 gdb)提供者,除了转储文件外,我们看不到用户的源代码。

非常感谢您的帮助..!!

最佳答案

不,这是不可能的。特别是在您给出的示例中,所有 路径导致对 abort 的调用,GCC 很可能会丢弃对 a 和刚刚生成了一个对 abort 的调用。

据我所知,DWARF 中的行表信息(将地址映射到源文件和行号)没有任何设施可以使行号成为特定地址映射以某些 DWARF 表达式为条件.因此,我的理解是单个地址只能代表一个源代码行,因此 GCC 必须为每个地址选择一个行号。

在您的示例中,GCC 选择了第 13 行,这似乎是一个明智的选择,因为所有先前的代码都检查 a 确实是多余的。

获得更具体的回溯的唯一方法是在没有优化的情况下进行编译,或者使用比 GDB 更强大的工具。

关于c - 如何知道任何库函数(中止)调用是否在源代码中多次使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33560605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com