ブログ

割とコンピュータよりの情報をお届けします。

2021/04

.NET Frameworkとネイティブdllが混ざったときの不具合追及

.NETでDllImportを使っていると例外が発生しないで突然「××は動作を停止しました。」と出てしまうことがある。最近この場面に遭遇した。

「××は動作を停止しました。」と出たときにWindowsコントロールの「信頼性の履歴の表示」に,APPCRASHというイベント名で記録が残る。
これは便利なのだが,例外の種類が0xc0000374になっていて発生頻度が割と低い場合には非常にデバッグが難しい。
これはヒープ破損らしい。
そもそも,.NET Framework 4.0からAccessViolationExceptionを検知できなくなっているらしい。そのため,例外をキャッチしてクラッシュログを残そうなどということができない。app.configに<legacyCorruptedStateExceptionsPolicy enabled="true"/>を追加することでこれは回避できる。
しかし,それだけでは見逃す。0xc0000374はヒープ破壊を起こした時に起きるというより,壊れているのを検知したときに起きる(実害が発生しそうなタイミングで起きる)ので問題のあるコードはもっと前に実行されていることがある。

そこで,Windows SDKに含まれるDebugging Tools for WindowsgflagsでPage Heapを有効にして置きexe.configの<runtime>要素内に<legacyCorruptedStateExceptionsPolicy enabled="true"/>を追加して,ヒープ破壊っぽいことが起きたらAccessViolationExceptionが上がるようにして例外をキャッチしてクラッシュログを残す。(といいらしい)

Page Heapは非常に重いが,例外発生の確実性が大幅に増す。

≫ 続きを読む

2021/04/09 コンピュータ   TakeMe

Python numpyでFFTを実行する.周波数軸はどうしたら4

前の記事ではnumpy.fft.fftfreqをプロットの時の範囲指定に使うことしか考えていなかったが,フィルタなどもできる.

numpy.fft.fftfreqによって生成した周波数軸とnumpy.whereを使うと周波数でフィルタリングが行える.
例えば,
Fzf = np.fft.fft(z);
Fz2f = np.where(np.abs(freq2) > 12, 0, Fzf)
などとすれば,周波数成分を取り除くことができる(0で埋めることができる).
np.fft.ifftで時間領域の信号に戻せば0で埋めた成分は消えている.

import numpy as np
import matplotlib.pyplot as plt

# 例の信号を作成
t = np.linspace(0.001, 4, 1000);
z = 0.1 + 0.2 * np.sin(t * 10 * 2 * np.pi) + 0.2 * np.sin(t * 33 * 2 * np.pi);

# サンプリング周波数
fsmp = 1 / (t[1] - t[0]);
# 解析時間
t_len = t.max() - t.min();

Fzf = np.fft.fft(z); # Fzfはfftした結果
Fz = Fzf / z.shape[0] * 2; # 折り返すのでパワーが2分の1になっている.
Fz[0] = Fz[0] / 2; # 平均成分は折り返さない.
Fz_abs = np.abs(Fz);


freq2 = np.fft.fftfreq(len(t), d=1.0/fsmp);# 周波数軸の生成

# abs(freq2)が12以上の成分をカット
Fz2f = np.where(np.abs(freq2) > 12, 0, Fzf) # filter
z_filtered = np.fft.ifft(Fz2f);
Fz2 = Fz2f / z.shape[0] * 2;
Fz2[0] = Fz2[0] / 2;
Fz2_abs = np.abs(Fz2);


plt.figure(1)
# 比較FFTプロット
plt.subplot(211);
plotrange = np.where(freq2 >= 0)
plt.plot(freq2[plotrange], Fz_abs[plotrange]);
plt.plot(freq2[plotrange], Fz2_abs[plotrange]);

# 比較波形プロット
plt.subplot(212);
plt.plot(t, z);
plt.plot(t, z_filtered);

plt.savefig("valuestar.work.177.png")

plt.show();


≫ 続きを読む

2021/04/03 コンピュータ   TakeMe
Tag:Python

「場所が利用できません」ダイアログ

買ったばかりの外付けSSDで昨日の朝「場所が利用できません」ダイアログが出るようになってしまった.

買ったばかりのUSB接続の外付けSSDを使い始めて3日目の出来事だった.
ダイアログの中身は「D:\にアクセスできません。 ファイルまたはディレクトリが壊れているため、読み取ることができません。」で,エクスプローラにドライブのアイコンは見えていて,ドライブ文字も割り当てられている.
スタートメニューの「Windows 管理ツール」の「コンピュータの管理」「ディスクの管理」で対象のドライブがNTFSでなくRAWになっていることを確認した.

「エラー チェック」もできない(D:のプロパティの「ツール」タブから)。この時点では,「エラーチェック」できない場合には「CHKDSK」も使えないと勝手に思っていた。
焦っていると何も考えられない。「NTFS」が「RAW」になっているから「NTFS」と認識させるだけでよいだろうと,「TestDisk」を使用してみていたが,うまくいかない.どうも理由は違ったらしい。

CHKDSK /F D:

で不具合は一応消えた。(怖いのでいったんリカバリツールでバックアップを取ってから)まだ使い始めたばかりの記憶装置だったから被害の範囲を覚えていたが,ある程度使った状態で起こると怖いな.

今回の教訓は「D:\にアクセスできません。 ファイルまたはディレクトリが壊れているため、読み取ることができません。」というダイアログの表示の場合には「TestDisk」で修正できる内容ではない可能性が高い.

≫ 続きを読む

2021/04/01 コンピュータ   TakeMe