Team fortress 2 コミュニティサーバの建て方

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    書く予定

    とりあえず広告けし

    明日書きます、きっと書きます。
    スポンサーサイト

    PAYDAY2 起動しない・クラッシュ原因について探る

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    PAYDAY2が起動しなくなった時の対処例です。

    よくあるタイミング順に書いているつもりです。
    -16/01/22 「●(初回起動時から)そもそも起動しない」の項目を追加
    -16/06/05 「AppData」フォルダに関する補足を追加
    -16/09/29 「BLT導入で起動しなくなった」の項目を追加

    ●いろいろいじる前のお約束



    すべて自己責任で行ってください。

    ○セーブデータのバックアップは定期的に行いましょう

    PAYDAY2 セーブデータ手動バックアップ(batファイル)
    http://rinatl.blog.fc2.com/blog-entry-695.html

    ○クラッシュログの場所

    クラッシュ時のダイアログやクラッシュログを読むことも重要。
    クラッシュ時のエラーナンバーや文字列で検索すると有用な情報が手に入るかもしれません。
    C:\Users\ユーザ名\AppData\Local\PAYDAY 2\crashlog.txt

    ※AppDataフォルダは隠しフォルダなので通常の設定では見られません。
    上記アドレスを直接入力する。もしくは、アドレスバーに%appdata%と入力する。もしくは隠しフォルダを表示する設定に変更する。


    上記ログが無い場合は
    \SteamLibrary\SteamApps\common\PAYDAY 2\payday2_win32_release_XXXXX_crash_YYYYY.mdmp
    文字化けしているが、少し下にスクロールすると文字化けしていない場所があるので、そこを見ましょう。

    crashlog.txtの見方
    まず、crashlog.txtは今までのクラッシュログをすべて記録しています。最新のログは一番下にあります。

    PD2Crash6_log_.jpg

    こういう場合も
    PD2Crash7_log.jpg
    こちらはMODではなく、PAYDAY2自体の問題のようで。

    ●(初回起動時から)そもそも起動しない


    症状:ゲームをインストールしてすぐ、バニラ(MODなどを導入していない状態)なのに起動しようとすると
    「起動しています」からすぐに「同期しています」の表示が出るだけでゲームが正常に起動できない。


    オンボードグラフィックスチップを使っている方によく起こっているようです。

    ①条件


    まずは、クラッシュログを見ましょう。
    この症状の場合前述した
    C:\Users\ユーザ名\AppData\Local\PAYDAY 2\crashlog.txt

    にcrashlog.txtが無い場合があります、crashlog.txtが無い場合は
    \SteamLibrary\SteamApps\common\PAYDAY 2\payday2_win32_release_XXXXX_crash_YYYYY.mdmp

    をメモ帳などで開いてみましょう。
    文字化けしていますが、少し下にスクロールすると画像のように読める場所があると思います。

    PD2Crash6_log_minidmp.jpg

    この画像のように、

    Application has crashed: access violation
    -------------------------------
    Callstack:
    AcLayers (???) GetHookAPIs
    KERNELBASE (???) ResetEvent
    -------------------------------
    Current thread: Renderer
    -------------------------------
    GPU : Intel(R) HD Graphics 4000 / igdumdim32.dll[10.18.10.4276]


    に近い条件となっていれば、以下の方法で解決出来る可能性があります。
    (例では Intel(R) HD Graphics 4000になっていますが、オンボードであればバージョンが違っても)

    http://steamcommunity.com/app/218620/discussions/14/490123938441183185/

    上記サイトを日本語訳すると

    ②下記サイトからファイルをダウンロードし、解凍、PAYDAY2フォルダに配置する


    http://www.nexusmods.com/newvegas/mods/34778/

    解凍するとd3d9.dllがあるので
    \SteamLibrary\SteamApps\common\PAYDAY 2\

    に配置する。

    pd2crashd3d9.jpg

    ③renderer_settings.xmlからウィンドウモードにする


    C:\Users\ユーザ名\AppData\Local\PAYDAY 2\renderer_settings.xml

    を開き、windowed = "false"の値をtrueに書き換える。

    pd2crashd_renderer.jpg

    作業が終わりましたら、PAYDAY2を起動してみましょう。

    そもそも、
    C:\Users\ユーザ名\AppData\Local\PAYDAY 2\renderer_settings.xml

    が無いという方は次の項目へ


    ④下記サイトからrenderer_settings.xmlの雛形をダウンロードし、配置する


    http://www.mediafire.com/download/axmc1cx6uqbmq8v/renderer_settings.xml

    C:\Users\ユーザ名\AppData\Local\PAYDAY 2\

    にダウンロードしたxmlファイルを配置してください。

    作業が終わりましたら、PAYDAY2を起動してみましょう。


    ●MODを入れたら起動しなくなった。


    BLT導入で起動しなくなった


    バニラ(MODを何も導入していない、既存ファイルの書き換えも行っていない状態)では起動するが、BLT(IPHLPAPI.dll)を導入すると起動しなくなった場合、管理者権限でゲーム(payday2_win32_release.exe)を起動すると改善されることがあるようです。

    以上の情報をくださった方の環境とクラッシュログです。

    環境
    windows10
    Intel(R) HD Graphics 4000

    導入MOD
    Payday2BLT_r11_r5
    _JP_MOD_BLT8

    ログ
    IPHLPAPI (???) luaL_where
    IPHLPAPI (???) UnregisterPrioPostReq
    payday2_win32_release (???) ???
    payday2_win32_release (???) ???
    payday2_win32_release (???) ???
    payday2_win32_release (???) ???
    payday2_win32_release (???) ???
    payday2_win32_release (???) ???
    payday2_win32_release (???) zip_get_name
    ntdll (???) RtlFreeHeap
    ntdll (???) ZwQueryVirtualMemory
    KERNELBASE (???) VirtualQueryEx
    KERNELBASE (???) SetUnhandledExceptionFilter
    KERNELBASE (???) SetUnhandledExceptionFilter
    payday2_win32_release (???) ???
    payday2_win32_release (???) zip_get_name



    (すでにいくつかのMODを導入している状態に)新しいMODを導入で起動しなくなった


    導入したMOD単体の問題か、すでに導入していたMODとの相性問題の可能性が高いです。

    HoxHudと日本語MODが競合することがあるそうです。


    また、ごくまれではありますが、ダウンロードに失敗しているなどしてファイルが壊れているとクラッシュの原因になります。

    起動するだけであれば、起動出来ていた状態(MODを導入する前)に戻すだけでよいでしょう。
    MOD導入の際にPAYDAY2を構成するファイルを書き換えた場合(PAYDAY 2/assetsフォルダ内のbundleファイルの書き換えなど)は、ゲームキャッシュの整合性を確認する必要があるでしょう。

    どのMODと競合しているのか判定する場合は導入MODを半分抜き、起動するかの確認、起動すれば残り半分だけを導入し確認というようにしていくと判定しやすいかと思います。


    ●アップデートで起動しなくなった。

    ①MODを抜く
    特にHoxHudはアップデートによる変化に弱く、入れているだけで起動時にクラッシュすることがあります。
    アンインストールするには
    ・PAYDAY 2\IPHLPAPI.dll、
    ・PAYDAY 2\lib\Native\HoxHud.dll

    どちらか、もしくはどちらも削除する。

    ○PAYDAY2ゲームデータの場所


    \SteamLibrary\SteamApps\common\PAYDAY 2\

    Steamクライアントのゲームプロパティからも開けます。

    BLTint_2.jpg


    ●特定のタイミングでクラッシュする


    関係しそうなMODを抜いてみる。
    また、MODの公開場所や関連フォーラムやMODの名前や関連するキーワードを調べてみることが有効です。

    ●よくわからないが起動しなくなった。

    (これが一番厄介だが、一番多い。)

    ①ゲームキャッシュの整合性を確認する


    PD2Crash3.jpg

    ②再インストールする


    PAYDAY2を一度アンインストールしてから、インストールする。
    かなり大きいファイル群なので時間がかかります。

    ○起動しなくなった直前にした行動を振り返る
    振り返り、環境の変化を見直す。

    ③グラフィックカードのドライバを変える

    最新が必ずしも最良とは限りません。

    ○もうこの辺までくると、あとは考えられる可能性をすべて試してみるしかない(と思う)

    主にファイルの破損を疑う。

    ④Visual C++ 再頒布可能パッケージ(x86,x64共に)の再インストール

    Visual C++ 2008 SP1 再頒布可能パッケージ (x86)
    https://www.microsoft.com/ja-jp/download/details.aspx?id=5582
    Visual C++ 2008 SP1 再頒布可能パッケージ (x64)
    https://www.microsoft.com/ja-jp/download/details.aspx?id=2092

    Visual C++ 2010 SP1 再頒布可能パッケージ (x86)
    https://www.microsoft.com/ja-jp/download/details.aspx?id=8328
    Visual C++ 2010 SP1 再頒布可能パッケージ (x64)
    https://www.microsoft.com/ja-jp/download/details.aspx?id=13523

    Visual Studio 2012 更新プログラム 4 の Visual C++ 再頒布可能パッケージ
    http://www.microsoft.com/ja-jp/download/details.aspx?id=30679

    Visual Studio 2013 の Visual C++ 再頒布可能パッケージ(x86 x64)
    http://www.microsoft.com/ja-JP/download/details.aspx?id=40784

    ○Microsoft .NET Frameworkの再インストール

    Microsoft .NET Framework 3.5 Service Pack 1 (フル パッケージ)
    https://www.microsoft.com/ja-jp/download/details.aspx?id=25150

    Microsoft .NET Framework 4.5
    https://www.microsoft.com/ja-jp/download/details.aspx?id=30653

    ⑤DirectXの再インストール

    DirectX エンド ユーザー ランタイム Web インストーラ
    http://www.microsoft.com/ja-jp/download/details.aspx?id=35

    ○設定データやセーブデータの破損を疑う


    ⑥PAYDAY2画面設定の削除

    C:\Users\ユーザ名\AppData\Local\PAYDAY 2\renderer_settings.xml


    ⑦セーブデータの削除

    必ずローカルにバックアップを取ってから!!!
    標準設定ではローカルにセーブデータが無ければSteamクラウドからダウンロードしてしまうので設定を変えておく必要がある。
    Steamクラウドのチェックボックスを外しておく。

    Steamクラウドと進行状況が違うと警告が出るので、状況に応じて適切に選択してください。

    C:\Program Files (x86)\Steam\userdata\ランダムな数列\218620\

    PD2Crash4.jpg

    どちらかのファイルが壊れているだけでもクラュシュする。
    どちらが壊れているか特定するには片方ずつを元の場所に戻し、起動できるか試す。
    ・save000.sav おそらく設定情報が保存されている(?)
    ・save098.sav 進行状況が保存されている


    ⑧DLCを抜いてみる

    プロパティからチェックを外すだけ。
    PD2Crash5.jpg

    配列の宣言とアクセス方法

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    VBAかじったので忘備録
    数時間いじった程度の知識量

    宣言方法とそれぞれのアクセス方法について例を示しています。
    タイトルのジャグ配列は一番最後です。

    (一次元)配列

    excel_exp_array1.png

    宣言方法1


    Dim x(3) As Variant
    x(0) = "a"
    x(1) = "b"
    x(2) = "c"
    x(3) = "d"

    ※Dim x(i) As Variantで用意されるiは要素数ではなく、要素の添え字なので要素数-1を指定する。

    宣言方法2


    Dim x(0 To 4) As Variant
    x(0) = "a"
    x(1) = "b"
    x(2) = "c"
    x(3) = "d"

    ※Dim x(i To j) As Variantのiは自由に決められる。i=1 j=3とすると、x(1)から3個の要素数を確保する。

    宣言方法3


    Dim x As Variant
    x = Array("a","b","c","d")

    ※動的配列の場合はReDimを使用する

    アクセス方法


    x(1)
    x(3)
    など


    多次元配列

    excel_exp_array.png
    3行4列の二次元配列

    宣言方法1


    Dim x(2,3) As Variant
    x(0,0) = "a"
    x(0,1) = "b"
    ...
    x(2,3) = "i"

    宣言方法2


    Dim x(0 To 3, 0 To 4) As Variant
    初期値の設定方法は宣言方法1と同じなので省略する。

    宣言方法3


    Dim x As Variant
    x = Array(Array("a", "b", "c", "d"), Array("e", ....), .... Array(..., "i"))
    ほぼジャグ配列の考え方、配列の中に配列を宣言する方法。

    ※次元数を増やす場合はDim x(i, j, k ...) As Variant

    アクセス方法1


    宣言方法1,2の場合はこちら
    x(0,0) = "a"
    x(0,1) = "b"
    ...
    x(2,3) = "i"

    宣言方法3の場合はこちら
    x(0)(0) = "a"
    x(i)(j) = k

    ジャグ配列

    excel_exp_jugarray.png

    ジャグ配列は何行何列と言えるのか・・・?
    あえて言うならば3行4列の二次元ジャグ配列

    宣言方法1


    Dim x As Variant
    x = Array(Array("a", "b", "c"), Array("d", "e"), Array("f", "g", "h", "i"))

    宣言方法2(試していないので動作不明)


    事前に配列を複数個宣言しておいて、他の配列に入れるという方法でもよいかもしれない。
    Dim x As Variant
    Dim i As Variant
    i = Array("a", "b", "c")
    Dim j As Variant
    j = Array("d", "e")
    Dim k As Variant
    k = Array("f", "g", "h", "i")
    x = Array(i, j, k)

    アクセス方法


    x(0)(0) = "a"
    x(i)(j) = k


    おまけ


    動的配列の割り当て


    Dim x As Variant
    x = Array("a", "b")

    x(0) -> a
    x(1) -> b

    ReDim x(3)でxの要素数を添え字3個までの4個を確保する
    ただし、注意しなければならないのはこの際これまでの要素をすべて削除し、サイズを変更する点。
    つまり
    x(0) ->
    x(1) ->
    となる。

    要素を引き継ぎつつ、サイズを変更する場合は

    ReDim Preserve x(3)

    とする必要がある。


    要素数を調べる関数


    LBound関数 -> 引数で指定した配列で使用できる最も小さいインデックス番号を返す
    UBound関数 -> 引数で指定した配列で使用できる最も大きいインデックス番号を返す

    使用例
    Dim x As Variant
    x = Array("a","b","c","d")

    LBound(x)とした場合は0
    UBound(x)とした場合は3
    を返す。

    Adobe Acrobat Reader DCのツールパネルの消し方

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    Adobe Acrobat Reader DCになって文章中に注釈などをつけられるようになりかなり便利になった一方でツールメニューが毎度開くので邪魔!と思っていました。

    ついに限界が来てオプションからツールをたたんでおくオプションを探しました。

    「編集」 -> 「環境設定」 -> 「文書」 -> 「ツールパネルをそれぞれのドキュメントに開く」
    のチェックを外す

    adobeacrobatreader_setting1.jpg
    adobeacrobatreader_setting2.jpg

    ちなみに、ツールパネルを開くときは文書の右のスクロールバー横のサンカクマークを押す。

    [覚書] C# 非同期処理の例外処理外エラー個所の特定

    PAYDAY2 Blacklist Assist

    最近更新中のPAYDAY2のBlacklist MODの補助ツール
    ※特に理由が無い場合は最新バージョンを使用してください。


    ━━━━━━━━━━━━━━━━━━━━━━━━━━━

    最近非同期処理を実装したプログラムを書いているのだが、非同期で例外処理をきちんとしていないとエラーがとても厄介なことになると学んだ。
    この場合のエラー個所の特定方法についての覚書。

    まず、非同期処理内で例外処理(try catch)をしていない場合に表示されるエラーについて。

    非同期処理内、例外処理なし
    タイトル「TargetInvocationExceptionはハンドルされませんでした。」
    追加情報「呼び出しのターゲットが例外をスローしました。」
    rainflow_async_error1.jpg


    非同期処理内、例外処理あり
    try{ /// }catch(Exception ex){ ex.ToString(); } とりあえず例外表示するだけ
    rainflow_async_error2.jpg


    同期処理内、例外処理なし
    タイトル「ArgumentOutOfRangeExceptionはハンドルされませんでした。」
    追加情報「インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。」
    rainflow_async_error3.jpg


    今回引っかかったのは、いろいろといじって、いじりすぎて、いざデバッグを実行したところ、”非同期処理内、例外処理なし”のエラーが表示されたが、いじった個所が多すぎてどこが問題なのかわからなかったことだ。
    とりあえず、該当しそうな箇所に try{ /// }catch(Exception ex){ ex.ToString(); } を入れてみたが”非同期処理内、例外処理なし”のエラーしか出ない。

    困ってグーグル先生に聞いたところ
    「トレースログを出力する」
    とよいらしいという情報を得た。
    が、ログを出力するコードを追加したもののログを出力する前にエラーが出ているようで追加の情報は得られなかった。
    (付け焼刃でコードを追加したので追加箇所が正確ではない可能性がある。)

    これは困ったとだめもとで
    ”非同期処理内、例外処理なし”のエラーダイアログの「例外の詳細をクリップボードに追加」を実行した。


    System.Reflection.TargetInvocationException はハンドルされませんでした。
    HResult=-2146232828
    Message=呼び出しのターゲットが例外をスローしました。
    Source=mscorlib
    StackTrace:
    場所 System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
    場所 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
    場所 System.Delegate.DynamicInvokeImpl(Object[] args)
    場所 System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme)
    場所 System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj)
    場所 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    場所 System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme)
    場所 System.Windows.Forms.Control.InvokeMarshaledCallbacks()
    場所 System.Windows.Forms.Control.WndProc(Message& m)
    場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    場所 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    場所 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    場所 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    場所 System.Windows.Forms.Application.Run(Form mainForm)
    場所 Rainflow.Program.Main() 場所 C:\Users\xxxxxxx\Documents\Visual Studio 2015\Projects\Rainflow\Rainflow\Program.cs:行 19
    場所 System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
    場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    場所 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    場所 System.Threading.ThreadHelper.ThreadStart()
    InnerException:
    HResult=-2146233086
    Message=インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
    パラメーター名:index
    ParamName=index
    Source=mscorlib
    StackTrace:
    場所 System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
    場所 System.Collections.Generic.List`1.get_Item(Int32 index)
    場所 Rainflow.DGV.d__3.MoveNext() 場所 C:\Users\xxxxxxx\Documents\Visual Studio 2015\Projects\Rainflow\Rainflow\Control.cs:行 316
    --- 直前に例外がスローされた場所からのスタック トレースの終わり ---
    場所 System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.b__6_0(Object state)
    InnerException:


    Message=インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
    この情報は大きい!そしてその下の
    場所 Rainflow.DGV.d__3.MoveNext() 場所 C:\Users\xxxxxxx\Documents\Visual Studio 2015\Projects\Rainflow\Rainflow\Control.cs:行 316
    ここが問題だそうだ。

    ということで、修正しました。
    例外処理はちゃんとしようね。
    メッセージ表示するだけでも効果あるある。
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。