実行可能ライブラリや動的ライブラリなどのバイナリを調べて、リリース バージョンかデバッグ バージョンかを判断するための簡単なコマンド ライン ユーティリティはありますか? * nixまたはwindowsでそのようなものはありますか?
8 に答える
Linux上の C++の場合、次のことができます。
objdump --source yourbin |grep printf
printf を、実行する関数呼び出しに置き換えます。デバッグの場合は、実行した実際のソース コード呼び出しがすべて表示されます。リリースの場合は、シンボル テーブルから設立されたシンボルを表示するだけです。
C++ on Windowsの場合、depends.exe を使用して、MSVCRT (リリース) または MSVCRTD (デバッグ) に依存しているかどうかを確認できます。
Linux では、動的ライブラリに対しても「file」コマンドを使用できます。「ストリップ済み」と表示されている場合は、すべてのデバッグ シンボルが取り除かれています。「脱がない」と言われたらその逆
unix の場合: ELF 実行可能ファイルでは、objdumpまたはnmを使用して実行可能ファイルのシンボル テーブルを確認できる場合があります (これは、削除されていない場合にはるかにうまく機能することに注意してください)。特定のシンボルの有無は、デバッグ ビルドまたはリリース ビルドを示す傾向があります。(これについては、おそらく使用しているライブラリなどに依存します。一般的なものを見つけるには、少し掘り下げる必要があります。コメントで探すものを自由に提案してください。答え。)
Windows の場合: dependencywalker の提案は適切です。コマンド ラインに相当するものについては、ほとんどの Visual Studio インストールでdumpbinを見つけることができます。これは、*nix の objdump といくらか同等です。また、一部の Windows exe ファイルで動作する msys や cygwin などで nm または objdump を見つけることができる場合もあります。
Windows の場合、Dependency Walkerには、exe がロードするすべての dll (およびその依存関係) をリストするオプションのコマンドライン出力があります。それを grep で実行し、msvcrt-dll が広告付きでポップアップするかどうかを確認します。
これは、動的にリンクされている場合にのみ機能します。それ以外の場合は、よりトリッキーになる可能性があります。
それらの文字列が実行可能ファイルに表示されている場合、デバッグ/リリースで異なる特定の機能をおそらくgrepできます。
アプリがランタイムをまったく使用しない場合は、かなり注意が必要です。
ほとんどの場合、実行可能ファイルとライブラリの両方のデバッグ バージョンは、ランタイムのデバッグ バージョンに対してリンクされます。Windows では、デバッグ/リリース バージョンの命名スキームがあり、一部は MS に準拠しています。ライブラリのデバッグ バージョンの名前は d で終わる必要があります。Dependency Walker ( http://www.dependencywalker.com )などのツールを使用して、実行可能ファイルまたはライブラリが依存しているライブラリを確認できます。ランタイム ライブラリのデバッグ バージョンが見つかった場合、実行可能ファイルまたはライブラリがデバッグ モードでビルドされている可能性が高くなります。
ただし、これは次の場合にのみ機能します
- ランタイムの名前を見て、それがどのバージョンであるかを知ることができます (上記で説明したような命名スキームに従います)。
- 実行可能ファイル/ライブラリは、静的ランタイムではなく動的ランタイムに対してリンクされています。2番目のケースでは、ランタイムが実行可能ファイル/ライブラリに取り込まれ、依存関係ではなくなります
- あなたはWindowsを使用しています:)
先に進むことはあまりありません。Reflector でアセンブリを開くと、Assembly Attribute を探すことができます。
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.Default)]
しかし、明らかにそれはリリースモードにも追加されています。
それが独自のアセンブリである場合、解決策はいくつかのプリプロセッサ ディレクティブを使用することです。
#ifdef DEBUG
[MyAttribute("foo")]
#endif
編集:申し訳ありませんが、私は.NETを想定していました。私のハンマーがあります。
filever.exe を使用できます。
filever.exe <my binary file>
--a-- W32i APP - 1.0.0.0 shp 25,600 11-03-2013 <my file>
Filever を入手するには、Windows XP 用のサポート ツールをダウンロードできます。
Windows 7 以降に移行した場合 (ほとんどの Windows ユーザーと同様)、ダウンロードして winzip で開くことができます。
次に、support.cab から filever を抽出します。
Windows 7で問題なく動作します。