当前位置: 首页 > 面试题库 >

使用C或C ++打印调用堆栈

林俊英
2023-03-14
问题内容

每当调用某个函数时,是否有任何方法可以在C或C ++的运行进程中转储调用堆栈?我想到的是这样的:

void foo()
{
   print_stack_trace();

   // foo's body

   return
}

Where的print_stack_trace工作方式与callerPerl
类似。

或类似这样的东西:

int main (void)
{
    // will print out debug info every time foo() is called
    register_stack_trace_function(foo);

    // etc...
}

在其中register_stack_trace_function放置某种内部断点,该断点将在每次foo调用时打印堆栈跟踪。

标准的C库中是否存在类似的东西?

我正在使用GCC在Linux上工作。

背景

我有一个测试运行,该行为基于一些不应影响此行为的命令行开关而有所不同。我的代码有一个伪随机数生成器,我假设根据这些开关的调用方式有所不同。我希望能够使用每组开关运行测试,并查看每个随机数生成器的调用方式是否有所不同。


问题答案:

对于仅适用于Linux的解决方案,您可以使用backtrace(3),它仅返回一个数组void *(实际上,每个数组都指向相应堆栈帧中的返回地址)。为了将这些转换为有用的东西,有backtrace_symbols(3)。

注意backtrace(3)中的notes部分:

如果不使用特殊的链接器选项,则符号名称可能不可用。对于使用GNU链接程序的系统,必须使用-
rdynamic链接程序选项。请注意,“静态”函数的名称未公开,并且在回溯中将不可用。



 类似资料:
  • 问题内容: 我正在寻找一种在PHP中打印调用堆栈的方法。 如果函数刷新IO缓冲区,则奖励积分。 问题答案: 如果要生成回溯,则正在寻找 和/或 。 例如,第一个将为您提供一个像这样的数组 (引用手册) : 它们显然不会刷新I / O缓冲区,但是您可以使用 和/或自己进行操作 。 (请参阅第一个手册页,以了解为什么使用“和/或” ;-))

  • #include<stdio.h> void a(void) { printf("Tail call frame\n"); } void b(void) { a(); } void c(void) { b(); } int main(void) { c(); return 0; } 技巧 当一个函数最后一条指令

  • 嗨,我正在尝试使用C#应用程序的收据打印机打印一张账单/收据。 预期输出是这样的: 我一直在使用函数,但是输出常常不对齐,并且GET的间距取决于项目名称长度等。 怎样才能解决这个问题? 我使用的代码是

  • 我刚刚开始学习C编程,为了锻炼我找到了这个任务。我必须使用动态、基于数组的整数堆栈编写PriorityQueue。这就是我到目前为止得到的。 提前感谢您的帮助。

  • 我被这个聪明的问题困住了。我找不到一个可定制的解决方案。我正在尝试使用打印列表的。这是代码: 我试图得到这个结果(例如): 等等。问题是,我总是得到这样的信息(每次都是从打印出来的): 像这样: 并对列表的其余部分依此类推。谁能指导我解决这件事。任何帮助都非常感谢。

  • 我尝试使用PrintTicket对象(Microsoft)设置订书钉属性,但它不起作用。我已验证是否安装了正确的打印驱动程序。当我手动打印时,我能够钉上打印输出,所以我确信打印机支持它。 我编辑了这篇文章以包含完整的代码。我在这里使用的PDF库是pdfiumviewer。我没有检查这段代码中的返回值,但如果我运行它,得到的返回值给我“ConflictStatus.ConflictResolved”