LLVMのlibunwindは、C++およびCプログラムにおけるスタックアンワインディングをサポートするライブラリです。スタックアンワインディングは、例外処理やデバッグ情報の取得に必要な操作であり、特に例外がスローされたときに、呼び出し履歴を辿るために重要です。

特徴

編集
  • クロスプラットフォーム:
    • libunwindは、Linux、macOS、FreeBSD、Windowsなど、さまざまなプラットフォームで動作します。これにより、異なるオペレーティングシステム間での互換性が向上します。
  • 低レベルのスタック情報の取得:
    • プログラムのスタックトレースを取得するためのAPIを提供します。これにより、デバッグやエラーハンドリングが容易になります。
  • 例外処理のサポート:
    • C++の例外処理機構(例えば、`try`/`catch`構文)に対応し、例外が発生した際のスタックの状態を適切に管理します。
  • カスタマイズ可能なビルドオプション:
    • 様々なコンパイラやプラットフォームに対して、最適化や特定の機能を有効にするためのビルドオプションを提供します。

インストール

編集

libunwindのインストール方法は以下の通りです。

ソースからのビルド

編集
  1. リポジトリのクローン:
       git clone https://github.com/libunwind/libunwind.git
    
  2. ビルドディレクトリの作成:
       cd libunwind
       mkdir build && cd build
    
  3. CMakeを使用して構成:
       cmake ..
    
  4. ビルド:
       make
    
  5. インストール:
       sudo make install
    

パッケージマネージャの使用

編集
  • Debian:
      sudo apt install libunwind-dev
    
  • FreeBSD:
      pkg install libunwind
    

使用方法

編集

libunwindを使用するには、プログラム内でヘッダーファイルをインクルードし、提供されているAPIを利用します。以下は基本的な使用例です。

#include <unwind.h>
#include <iostream>

void print_stacktrace() {
    _Unwind_Backtrace([](struct _Unwind_Context* context, void* arg) {
        // スタック情報を取得するロジック
        return _URC_NO_REASON;
    }, nullptr);
}

他の実装との互換性

編集

libunwindには同名の他の実装がいくつか存在しますが、これらの実装は互換性がない場合があります。特に以下の実装が存在します。

  • GNU libunwind:
    • GNUプロジェクトによって提供されるlibunwindの実装です。機能は似ていますが、APIや動作が異なるため、互換性はありません。
  • System V ABI libunwind:
    • System V ABIに基づく実装で、特にUNIX系システムでの利用が多いです。APIが異なり、移植性に影響を与える可能性があります。

参考文献

編集

外部リンク

編集