如何在跟踪断言失败时知道调用方函数

How to know caller function when tracing assertion failure

本文关键字:方函数 调用 函数 跟踪 断言 失败      更新时间:2023-10-16

我的问题与这篇SO帖子和其他一些类似的帖子有关。我想知道调用方函数的名称,因为在断言失败时,我不知道是哪个函数向被调用方传递了垃圾值。一种方法是检查所有可以调用该函数的函数,但这非常麻烦。

你能提出一个更好的解决方案吗,即使它依赖于平台?我使用g++4.6。提前谢谢。

参见backtrace()

例如

#include <execinfo.h>
#include <stdio.h>
void bar() {
  void* callstack[128];
  int i, frames = backtrace(callstack, 128);
  char** strs = backtrace_symbols(callstack, frames);
  for (i = 0; i < frames; ++i) {
    printf("%sn", strs[i]);
  }
  free(strs);
}
int foo() {
  bar();
  return 0;
}
int main() {
  foo();
  return 0;
}

输出:

0   a.out                               0x0000000100000e24 bar + 28
1   a.out                               0x0000000100000e81 foo + 14
2   a.out                               0x0000000100000e96 main + 14
3   a.out                               0x0000000100000e00 start + 52
4   ???                                 0x0000000000000001 0x0 + 1

参见:

如何在我的gcc C++应用程序崩溃时生成堆栈争用

glibc中有回溯函数。它可以允许您使用调用方函数或方法进行完全跟踪。

如果您只想要调用者,gcc中也有专门的函数:

__builtin_frame_address(int level);

有了level == 1,您就有了调用者函数。有关如何使用的更多详细信息,请参阅本文

以下是文档中的示例程序:

#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
/* Obtain a backtrace and print it to stdout. */
void
print_trace (void)
{
  void *array[10];
  size_t size;
  char **strings;
  size_t i;
  size = backtrace (array, 10);
  strings = backtrace_symbols (array, size);
  printf ("Obtained %zd stack frames.n", size);
  for (i = 0; i < size; i++)
     printf ("%sn", strings[i]);
  free (strings);
}
/* A dummy function to make the backtrace more interesting. */
void
dummy_function (void)
{
  print_trace ();
}
int
main (void)
{
  dummy_function ();
  return 0;
}