C語言筆記 使用BackTrace查看調用堆棧

函數原型

int backtrace(void **buffer, int size);

返回調用堆棧

buffer :提供一個指針的數組

size :指定緩衝區的個數,即設置的調用深度

int : 返回實際返回的調用深度

每個地址指針由 函數名、地址偏移、返回地址組成

char **backtrace_symbols(void *const *buffer, int size);

字符串結果通過該API返回,會在該函數中malloc,由我們free

使用方法

	void Backtrace(std::vector<std::string>& bt, int size, int skip) {
		void** array = (void**)malloc((sizeof(void*) * size));
		size_t s = ::backtrace(array, size);

		char** strings = backtrace_symbols(array, s);
		if (strings == NULL) {
			SYLAR_LOG_ERROR(g_logger) << "backtrace_synbols error";
			return;
		}

		for (size_t i = skip; i < s; ++i) {
			bt.push_back(demangle(strings[i]));
		}

		free(strings);
		free(array);
	}

	std::string BacktraceToString(int size, int skip, const std::string& prefix) {
		std::vector<std::string> bt;
		Backtrace(bt, size, skip);
		std::stringstream ss;
		for (size_t i = 0; i < bt.size(); ++i) {
			ss << prefix << bt[i] << std::endl;
		}
		return ss.str();
	}

參考資料:

https://www.linuxidc.com/Linux/2012-11/73470p2.htm

https://blog.csdn.net/qq_28351465/article/details/82999140

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章