吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1297|回复: 3
收起左侧

[C&C++ 转载] 输出函数调用过程

[复制链接]
古月不傲 发表于 2021-1-13 00:31
本帖最后由 古月不傲 于 2021-1-13 01:00 编辑

[C++] 纯文本查看 复制代码
#include <iostream>
#include <string>
#include <cxxabi.h>
#include <execinfo.h>

void bb();
void cc();

// 输出函数回朔过程,并以C函数名的风格显示
std::string stackTrace(bool demangle)
{
	std::string 			stack;
	const int max_frames 	= 250;
	void					*frame[max_frames];
	// 第一个参数,返回的回朔地址缓存区
	// 第二个参数,要容纳多少个地址
	// 返回值,栈帧编号,表示第几个函数
	int nptrs 				= backtrace(frame, max_frames);
	// 第一个参数,已经接收到的回朔地址缓存区
	// 第二个参数,接收到的栈帧编号
	char** strings 			= backtrace_symbols(frame, nptrs);

	if (strings)
	{
		size_t len = 256;
		// 分配内存
		char* demangled = demangle ? static_cast<char*>(::malloc(len)) : nullptr;

		// 解析每个地址成字符串
		for (int i = 1; i < nptrs; ++i)  // skipping the 0-th, which is this function
		{
			if (demangle)
			{
				char* left_par 	= nullptr;
				char* plus 		= nullptr;

				// 解析每个字符 找到( + 号的位置
				for (char* p = strings[i]; *p; ++p)
				{
					if (*p == '(')
						left_par = p;
					else if (*p == '+')
						plus = p;
				}

				// ( && +
				if (left_par && plus)
				{
					*plus = '\0';	// 将函数名后面的 +号先清0 以便截取函数名
					int status = 0;
					// 将函数名翻译成C语言风格
					char* ret = abi::__cxa_demangle(left_par+1, demangled, &len, &status);
					*plus = '+';	// 重新设置 +号
					if (status == 0)
					{
						demangled = ret;  // ret could be realloc()
						// 追加到statck  strings.start -- "(+1"
						stack.append(strings[i], left_par+1);
						// 追加函数名称
						stack.append(demangled);
						// 追加函数名称之后的部分,一直到\0
						stack.append(plus);
						// 添加换行
						stack.push_back('\n');
						continue;
					}
				}
			}
			// Fallback to mangled names
			stack.append(strings[i]);
			stack.push_back('\n');
		}
		free(demangled);
		free(strings);
	}
	return stack;
}

void a()
{
	bb();
}

void dd()
{
	printf("%s\n", stackTrace(true).c_str());
}

void bb()
{
	int size = 200;
	void *buf[200]{};
	int c = backtrace(buf, 200);
	char **str = backtrace_symbols(buf, c);
	for (int i = 0; i < c; i++)
		printf("%s\n", str[i]);
	free(str);
	cc();
}

void cc()
{
	printf("%s\n", stackTrace(true).c_str());
	dd();
}


int main()
{
	a();

	return 0;
}


编译时加上:     -rdynamic

免费评分

参与人数 1吾爱币 +7 热心值 +1 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

z1991627 发表于 2021-1-13 08:25
说个实话,我是把一本基础C的书看完了 为什么看不懂你的代码!看不我不适合编程
2513002960 发表于 2021-1-13 11:34
z1991627 发表于 2021-1-13 08:25
说个实话,我是把一本基础C的书看完了 为什么看不懂你的代码!看不我不适合编程

这个好像是c++  我也不会?
 楼主| 古月不傲 发表于 2021-1-13 12:44
本帖最后由 古月不傲 于 2021-1-13 12:46 编辑
z1991627 发表于 2021-1-13 08:25
说个实话,我是把一本基础C的书看完了 为什么看不懂你的代码!看不我不适合编程

这是muduo库的源码,主要用于异常回朔,看不懂可能是你没静下心,或者你的基础不够,还不能阅读第三方的源码。
这里面无非就用到了三个函数,加点指针的东西,静下心,一般都能看懂。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 21:18

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表