是否可以调试打印当前函数的调用者?

13 浏览
0 Comments

是否可以调试打印当前函数的调用者?

通常在调试代码时,我需要找出是谁在调用我放置了调试语句的函数。我知道__FUNCTION__会评估为当前函数的名称,但是否有类似的东西可以给我调用方的名称?或者可以打印出调用堆栈吗?

这些信息必须是可用的。如果我放入一个断言或会导致段错误的代码,我会得到一个显示整个调用堆栈的堆栈跟踪。堆栈跟踪打印代码是如何获取这些信息的?

如果您无法提供一个与平台无关的解决方案,那么对于在使用gcc编译的x86_64 Ubuntu 12.04上运行的情况,将可以接受。如果您能提供其他平台的解决方案,将获得额外的加分。

0
0 Comments

有时候在调试程序时,我们可能希望能够打印出当前函数的调用者。然而,C语言并没有提供直接获取调用者名称的方法。但是,有一种方法可以通过使用内置函数 `_ReturnAddress()` 来获得一个指针,该指针指向调用者。

通过使用 `_ReturnAddress()` 函数,我们可以获得一个指向调用者的指针。这个指针可以用于进一步的调试目的,例如打印调用者的地址或者进行其他操作。

以下是一个示例代码,展示了如何使用 `_ReturnAddress()` 函数来打印调用者的地址:

#include 
void print_caller_address() {
    void* caller = _ReturnAddress();
    printf("Caller address: %p\n", caller);
}
void foo() {
    print_caller_address();
}
int main() {
    foo();
    return 0;
}

通过调用 `print_caller_address()` 函数,我们可以在 `foo()` 函数中打印出调用者的地址。在这个例子中,调用者就是 `main()` 函数,因此会打印出 `main()` 函数的地址。

需要注意的是,由于 `_ReturnAddress()` 函数返回的是一个指针,我们无法直接获取调用者的名称。如果我们需要获取调用者的名称,可能需要使用其他的调试工具或技术来实现。

总结起来,尽管在C语言中无法直接获取调用者的名称,但我们可以使用 `_ReturnAddress()` 函数来获得一个指向调用者的指针,并通过这个指针进行调试和其他操作。

0
0 Comments

这是一个关于调试打印当前函数调用者的问题。这个问题的出现是因为不同的操作系统对于调试打印当前函数调用者的方式是不同的。在Linux和gcc中,可以使用backtrace(3)函数来实现。而在Windows中,可以参考这个Stack Overflow的问题。

对于Linux和gcc,可以使用backtrace(3)函数来获取当前函数的调用者。backtrace(3)函数是一个在程序中用于打印函数调用栈的函数,它可以返回一个指向调用栈的指针,并且可以通过解析这个指针来获取函数的调用栈信息。具体的使用方法可以参考Linux系统文档。

而对于Windows,可以参考这个Stack Overflow的问题来获取当前函数的调用者。这个问题中提到了一种在Windows中实现类似功能的方法。

总结起来,要解决这个问题,需要根据操作系统的不同选择不同的方法。在Linux和gcc中,可以使用backtrace(3)函数来获取当前函数的调用者。而在Windows中,可以参考Stack Overflow上的问题来获取当前函数的调用者。

0
0 Comments

通过遍历调用堆栈,查找返回地址并检查可执行文件,堆栈跟踪可以获取调用者的信息。然而,这种方式并不可移植,没有通用的方法来查找调用者。要找到调用者,最好的方法是在调试器下设置断点,当调试代码触发时触发断点。

另外,`__FUNCTION__`不是标准C++的一部分,似乎是GNU的东西。标准版本的`__FUNCTION__`实际上是`__func__`。

真的吗?C++11标准在8.4.2/8节中有提到。

大多数编译器都实现了`__FUNCTION__`和`__PRETTY_FUNC__`,即使它们不是标准的。

抱歉,你是对的。不过小细节,它在8.4.1/8节中,而不是8.4.2/8。

哎呀,是的,我滚动到页面底部找到它,没有检查是否开始了一个新的部分。

0