[C++] 30 segmentation fault発生時のデバッグ macOS

[M1 Mac, Big Sur 11.6.5, FLTK 1.3.8, OpenCV 4.5.5]

ある条件でFLTKアプリのボタンを押した時にsegmentation faultが発生しました。ターミナルにはトラブルが発生したとの情報しかないので困っていましたが、macOSではlldbというデバッガで調査できることを知りました。Linuxはgdbコマンドです。

内容はARM64のアセンブラです。今回は読解する前に解決できましたが、ざっと見た感じ分岐前のメモリからレジスタへの読み込み時にトラブルが発生したようです。

今更ですがこのトラブルでnullと空文字列が別物と知りました。この程度の知識でも簡単なアプリなら作れます。

lldb -f 実行ファイル名
(lldb) r
(lldb) exit
<実施例>

$ lldb -f ImageInspector 
(lldb) target create ImageInspector"
Current executable set to 'ImageInspector' (arm64).
(lldb) r
Process 84834 launched: 'ImageInspector' (arm64)
Process 84834 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0xffffffffffffffff)
    frame #0: 0x000000018fdea9d8 libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) + 20
libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string:
->  0x18fdea9d8 <+20>: ldrsb  w8, [x1, #0x17]
    0x18fdea9dc <+24>: tbnz   w8, #0x1f, 0x18fdea9f4    ; <+48>
    0x18fdea9e0 <+28>: ldr    q0, [x1]
    0x18fdea9e4 <+32>: ldr    x8, [x1, #0x10]
Target 0: (ImageInspector) stopped.

[C++] 29 ヘッダファイル、クラスファイルのテンプレ

FLTK1.3.8にはモーダルダイアログのウィジェットがないのでヘッダファイル他を作成中です。モーダルダイアログとは表示中ダイアログ内の操作以外ができなくなるウィジェットです。

#ifndef MODALDIALOG_H
#define MODALDIALOG_H

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
 
class modalDialog : public Fl_Window{
    public:
        modalDialog(int, int, const char* , const char*);
        ~modalDialog();

    public:
        void OnButtonOK(void) ;
        void OnButtonCancel(void);
};

#endif
#include "modalDialog.h"
#include <string>
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
 
using std::string;

Fl_Window *window;

// コンストラクタ
modalDialog::modalDialog(int w, int h, const char* title, const char* label)
    : Fl_Window(w, h, title){
}

// デストラクタ
modalDialog::~modalDialog()
{
}


void modalDialog::OnButtonOK(void)
{
}


void modalDialog::OnButtonCancel(void)
{
    hide();
}