gpt4 book ai didi

c++ - GDB 和 GCC 联盟

转载 作者:行者123 更新时间:2023-11-28 08:22:30 25 4
gpt4 key购买 nike

我的概念可能听起来有点神秘,但我提供了一些启动信息,说明我们在编译程序时如何使用 GCC 在程序中使用 GDB API/调试技术。我们绝对可以告诉 gcc 也链接 GDB 库。最终的帮助是当编译的程序执行时,它应该产生以下格式的日志:

文件名.cpp:行号

我们有什么办法可以实现它 - 我相信这是因为 GDB 如何知道这些细节,我正在寻找一些诀窍。

最佳答案

正如评论中已经建议的那样,其中一种选择是使用如下宏:

#define TRACE(_lvl, _msg) \
if ( IsTraceActive() && _lvl <= TraceActiveLevel() ) { \
std::ostringstream _trc_sstr; \
_trc_sstr << _msg; \
TraceWrite(__PRETTY_FUNCTION__, __FILE__, __LINE__, _trc_sstr.str()); \
}\

如果您使用的是 C++,您可以将它与一个类结合使用,该类在进入或退出函数时(在 ctor 和 dtor 中)和回溯(http://www.linuxjournal.com/article/6391 ).

#include <execinfo.h>
#include <dlfcn.h>
#include <cxxabi.h>

class TraceFunc {
public:
TraceFunc(const char* fnc, const char* file, int line)
: _fnc(fnc), _file(file), _line(line)
{
TraceWrite(_fnc, _file, _line, std::string(_fnc) + " in");
}


virtual ~TraceFnc()
{
TraceWrite(_fnc, m_file, _line, std::string(_fnc) + " out");
}

private:
const char* _fnc;
const char* _file;
int _line;
};

#define FNTRACE() TraceFunc _this_fnc(__PRETTY_FUNCTION__, __FILE__, __LINE__)

typedef std::vector<std::string> Stack;

Stack GetExecutionStack(int a_maxDepth)
{
Stack stack;

const int c_maxFuncName(500);

void *trace[c_maxDepth+1];
char **symbols(NULL);
char fname[c_maxFuncName];
int traceSize(0);

traceSize = backtrace(trace, a_maxDepth+1);
symbols = backtrace_symbols(trace, traceSize);

if (symbols == NULL) {
return stack;
}

// Starting at 1 to skip the function that we are currently in
for (int i = 1; i < traceSize; ++i) {
Dl_info info;
if (dladdr(trace[i], &info) != 0) {
int stat;
char *demangled = abi::__cxa_demangle(info.dli_sname, 0, 0, &stat);

if (demangled != NULL) {
// Re-compose the stack info with de-mangled C++ name
snprintf(fname, c_maxFuncName, "%s(%s) [0x%p]",
info.dli_fname, demangled, info.dli_saddr);
stack.push_back(fname);
free(demangled);
}
else {
stack.push_back(std::string(symbols[i]));
}
}
else {
stack.push_back(std::string(symbols[i]));
}
}

free(symbols);
return stack;
}

它是这样使用的:

int MySpecialFunc()
{
FNTRACE();

// Some code

TRACE(1, "Intermediate value: " << z << " mm.");

// more code
}

关于c++ - GDB 和 GCC 联盟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5295446/

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