muduo網路庫Exception異常類
1 Exception類
Exception類包括兩個檔案 :Exception.cc, Exception.h。
1.1 Exception.h
#ifndef MUDUO_BASE_EXCEPTION_H
#define MUDUO_BASE_EXCEPTION_H
#include <muduo/base/Types.h>
#include <exception>
namespace muduo
{
class Exception : public std::exception
{
public:
explicit Exception(const char* what);
explicit Exception(const string& what);
virtual ~Exception() throw();
virtual const char* what() const throw();
const char* stackTrace() const throw();
private:
void fillStackTrace();
string message_;
string stack_;
};
}
1.2 Exception.cc
#include <muduo/base/Exception.h>
//#include <cxxabi.h>
#include <execinfo.h>
#include <stdlib.h>
using namespace muduo;
Exception::Exception(const char* msg)
: message_(msg)
{
fillStackTrace();
}
Exception::Exception(const string& msg)
: message_(msg)
{
fillStackTrace();
}
Exception::~Exception() throw ()
{
}
const char* Exception::what() const throw()
{
return message_.c_str();
}
const char* Exception::stackTrace() const throw()
{
return stack_.c_str();
}
void Exception::fillStackTrace()
{
const int len = 200;
void* buffer[len];
int nptrs = ::backtrace(buffer, len);
char** strings = ::backtrace_symbols(buffer, nptrs);
if (strings)
{
for (int i = 0; i < nptrs; ++i)
{
// TODO demangle funcion name with abi::__cxa_demangle
stack_.append(strings[i]);
stack_.push_back('\n');
}
free(strings);
}
}
2 backtrace函式
int backtrace(void **buffer, int size); 棧回溯,儲存各個棧幀的地址;
buffer這個指標指向了一個陣列,陣列中的每一項都是void *型別,用來儲存函式的地址。
3 backtrace_symbols函式
char **backtrace_symbols(void const buffer, int size);根據地址,轉成相應的函式符號;
char strings = ::backtrace_symbols(buffer, nptrs);返回的是指標的指標;
4 還原C++函式的真實的名稱
需要的標頭檔案是<cxxabi.h>和<stdio.h>
string Exception::demangle(const char* symbol)
{
size_t size;
int status;
char temp[128];
char* demangled;
//first, try to demangle a c++ name
if (1 == sscanf(symbol, "%*[^(]%*[^_]%127[^)+]", temp)) {
if (NULL != (demangled = abi::__cxa_demangle(temp, NULL, &size, &status))) {
string result(demangled);
free(demangled);
return result;
}
}
//if that didn't work, try to get a regular c symbol
if (1 == sscanf(symbol, "%127s", temp)) {
return temp;
}
//if all else fails, just return the symbol
return symbol;
}
修改fillStackTrace()
void Exception::fillStackTrace()
{
const int len = 200;
void* buffer[len];
int nptrs = ::backtrace(buffer, len);
char** strings = ::backtrace_symbols(buffer, nptrs);
if (strings)
{
for (int i = 0; i < nptrs; ++i)
{
// TODO demangle funcion name with abi::__cxa_demangle
stack_.append(demangle(strings[i]));
stack_.push_back('\n');
}
free(strings);
}
}
相關文章
- muduo網路庫Timestamp類
- PHP 異常類 ExceptionPHPException
- muduo網路庫AtomicIntegerT原子整數類
- api模式下修改異常類ExceptionAPI模式Exception
- 異常(Exception)Exception
- muduo網路庫編譯安裝編譯
- Sanic Exception – 異常Exception
- C++ exception 異常類繼承關係C++Exception繼承
- oracle 使用異常exceptionOracleException
- Java中Error和Exception的異同以及執行時異常(Runtime exception)與檢查型異常(checked exception)的區別JavaErrorException
- NETCORE - 全域性異常處理(Exception)NetCoreException
- PHP基礎:異常處理ExceptionPHPException
- 甩鍋(throws)_ java異常(Exception)處理JavaException
- 異常-異常的概述和分類
- 異常分類
- Spring Cloud Gateway自定義異常處理Exception HandlerSpringCloudGatewayException
- 自定義異常類
- 網路網賭系統注單異常賬戶異常提款不了怎麼辦?
- muduo原始碼解析11-logger類原始碼
- Java中的Exception拋異常對效能的影響 - BaeldungJavaException
- Cacheable 類轉換異常
- 阿里雲異常流量及異常網路連線的安全解決過程阿里
- C++筆記 14:審慎使用異常規格(exception specifications)C++筆記Exception
- 用Kotlin的方式來處理網路異常Kotlin
- muduo
- Java基礎 ---Throwable異常類Java
- DataIntegrityViolationException異常:java利用mymatis連線資料庫異常AIExceptionJava資料庫
- 解決 發生異常: RuntimeError (note: full exception trace is shown but execution is paused at: <module>)ErrorException
- laravel-exception-notify - 支援多種通道的 laravel 異常監控通知LaravelException
- MV-Sketch介紹--網路流量異常檢測
- 用Fundebug外掛記錄網路請求異常
- Win10提示lsp狀態異常如何解決 lsp網路連線異常的方法Win10
- win10網路連線配置異常如何解決_win10系統網路連線配置異常的解決教程Win10
- 記錄Laravel異常處理類Laravel
- 重寫Laravel異常處理類Laravel
- JAVA類檔案操作和異常Java
- 網路網賭賬號異常系統抽查怎麼處理?
- 異常詳細資訊: System.ComponentModel.Win32Exception: 拒絕訪問。Win32Exception