Author Archives: admin

アプリがクラッシュしたときクラッシュダンプを作成する

レポジトリ

レジストリへ登録

レジストリキーHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\iwillcrash.exe以下にダンプ情報を作成する。

これはレポジトリにあるcreatecrashdump.regを実行することで作成できる。

クラッシュさせる

iwillcrash.exeを実行して、「Access Null Pointer」をクリックするとアプリが落ちて、%LOCALAPPDATA%\CrashDumpsにダンプファイルが作成される。

任意のアプリの登録

上記の実例ではiwillcrash.exeというファイルのアプリのみのダンプをとるので、レジストリキーのiwillcrash.exeのキー名を対象アプリのファイル名に変えれば任意のアプリのダンプをとることができる。

参考情報

Registry:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl

bashのifとtestとサブシェル

ハマったので適当なまとめ

if 1

1はコマンドではないので文法エラー

if x

xはコマンドではないので文法エラー。

ifの次にはコマンドを書かなければならない。

if uname

unameはコマンドで正常終了して0を返す。0は真と扱われる。

uname -b

unameには-bというオプションはないので、エラーになり1が返される。0以外は偽と扱われる。

if $(command)

$(command)はコマンドではなく、commandを実行した結果の標準出力なので文法エラー。

if [ $(command) ]

[はコマンド。$(command)[の引数、$(command)commandを実行し結果の標準出力の文字列を表す。][の引数。[の終わりを表す。[は文字列が与えられたときは長さが0でないときは真になる。unameを実行すると標準出力に文字を出力するので真になる。

if [ $(command -b) ]

uname -bはエラーになって標準出力にはなにも出力されないので、[には長さ0の文字列が与えられ偽になる。

問題:システムの種類によって処理を分ける

システムがMingかどうかを判定するif unameの出力がgrep -qの入力になり、MINGWで始まるときは0を返すので真になる。-qは標準出力に結果を表示しない。つまり戻り値だけを見る。

別回答

unameの出力がMINGWで始まるときはgrepが標準出力に結果を表示するので、それがあれば真になる。

ここでは[[[の違いは考慮してないが同じだと思う。[は古い形式のただのコマンド。[[はバッシュの組み込みだと思う。[[のほうがいいといわれている。

ダメな回答

grep -qは決して標準出力に出力しないので常に偽になる。

ソース

https://github.com/ambiesoft/blogprogs/tree/master/5786

static_assertで型チェック

is_sameで同じ型かどうかを判定する。
declspecで式から型を得る。
invoke_resultで関数の戻り値の型を得る。

ソース:https://github.com/ambiesoft/blogprogs/tree/master/5775/static_assert_type_check

emplace_backでムーブコンストラクタがあるのにコピーコンストラクタが呼ばれる

puch_backよりもemplace_backがいいと言われていて実験したら、push_backだとコピーコンストラクタが呼ばれないのに、emplace_backだと呼ばれる現象が発生。

結論

ムーブコンストラクタにnoexceptをつければコピーコンストラクタの代わりにムーブコンストラクタが呼ばれる。

ソース:https://github.com/ambiesoft/blogprogs/tree/master/5767

C++/WinRTのプロジェクトが作成できない

以下のようなエラーが出て作成できない場合。

C++/WinRTの拡張機能をインストールする

ユニバーサルWindowsプラットフォーム開発をインストールする

C++/CLIのBeginInvoke

BeginInvokeはInvokeと違って、非同期でデリゲートを呼び出します。別スレッドで実行されるので注意が必要です。待ったりするときはIAsyncResultを使います。

なおここで紹介しているBeginInvokeはControl::BeginInvokeとは違うものなので注意が必要です。

最もシンプル

引数を渡す

2つの引数を渡す

コールバックを設定してコールしてもらう

コールバック関数に値を渡す

クラスの関数で

2つのBeginInvokeを同時に待つ

ソースコード

https://github.com/ambiesoft/blogprogs/tree/master/5753