web-dev-qa-db-ja.com

winと* nixの両方でバイナリがリリースかデバッグかを判断する方法

実行可能ライブラリやダイナミックライブラリなどのバイナリを検査して、リリースバージョンかデバッグバージョンかを判断するための簡単なコマンドラインユーティリティはありますか? * nixやwindowsにそのようなものはありますか?

32
adfjoawesdfi
  • LinuxのC++の場合、次のことができます。

        objdump --source yourbin |grep printf
    

    Printfを、実行する関数呼び出しに置き換えます。デバッグの場合は、実際に行ったすべてのソースコード呼び出しが表示されます。リリースされている場合は、シンボルテーブルから設立されたシンボルが表示されます。

  • WindowsのC++の場合、depends.exeを使用して、MSVCRT(リリース)またはMSVCRTD(デバッグ)に依存しているかどうかを確認できます。

29
Bob Yoplait

Linuxでは、ダイナミックライブラリに対しても「file」コマンドを使用できます。 「削除済み」と表示されている場合は、すべてのデバッグシンボルが削除されます。 「剥がされていない」と言っている場合は反対です

17
Norbert Hartl

Windowsの場合、 Dependency Walker には、exeがロードするすべてのdll(およびそれらの依存関係)を一覧表示するオプションのコマンドライン出力があります。それをgrepで実行し、msvcrt-dllがdでポップアップするかどうかを確認します。

これは、動的にリンクされている場合にのみ機能します。そうでなければ、それはトリッキーかもしれません。

デバッグ/リリースが異なる特定の関数をgrepすることができますifこれらの文字列が実行可能ファイルに表示されます。

アプリがランタイムをまったく使用しない場合は、かなり注意が必要です。

3
Macke

unixの場合:ELF実行可能ファイルでは、objdumpまたはnmを使用して確認できる場合があります。実行可能ファイルのシンボルテーブル(削除しないと、これがはるかにうまく機能することに注意してください)。特定のシンボルの有無は、デバッグまたはリリースビルドを示す傾向があります。 (どちらについては、使用しているライブラリなどによって異なります。一般的なライブラリを見つけるには、少し掘り下げる必要があります。コメントで探すものを自由に提案してください。更新します。回答。)

Windowsの場合:dependencywalkerの提案は適切です。同等のコマンドラインについては、ほとんどのVisual Studioインストールでdumpbinを見つけることができ、* nixのobjdumpとやや同等です。また、たとえば、nmまたはobjdumpを見つけることができる場合があります。一部のWindowsexeファイルで動作するmsysまたはcygwin。

3
leander

先に進むことはあまりありません。 Reflectorでアセンブリを開くと、アセンブリ属性を探すことができます。

[Assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.Default)]

しかし、明らかにそれはリリースモードにも追加されています。

独自のアセンブリの場合、解決策はいくつかのプリプロセッサディレクティブを使用することです。

#ifdef DEBUG
[MyAttribute("foo")]
#endif

編集:申し訳ありませんが、私は.NETを想定しました。私のハンマーがあります。

2
Joshua Belden

ほとんどの場合、実行可能ファイルとライブラリの両方のデバッグバージョンは、ランタイムのデバッグバージョンに対してリンクされています。 Windowsには、いくつかのデバッグ/リリースバージョンの命名規則があります。その中にはMSがあります。ライブラリのデバッグバージョンの名前はdで終わる必要があります。 Dependency Walker( http://www.dependencywalker.com )などのツールを使用して、実行可能ファイルまたはライブラリが依存しているライブラリを確認できます。ランタイムライブラリのデバッグバージョンが見つかった場合、実行可能ファイルまたはライブラリがデバッグモードでビルドされている可能性が高くなります。

ただし、これは次の場合にのみ機能します

  • ランタイムの名前を見ると、それがどのバージョンであるかがわかります(上記のような命名規則に従います)
  • 実行可能ファイル/ライブラリは、静的ランタイムではなく動的ランタイムに対してリンクされています。 2番目のケースでは、ランタイムは実行可能ファイル/ライブラリにプルされ、依存関係ではなくなります
  • あなたはWindowsを使用しています:)
2
Piotr Dobrogost

これがどのバージョンであるかを確認するには、depends.exeを使用します。依存ウォーカーを介してファイルを開くと、必要なファイルが表示されます。 system32ファイルのリストを表示することで、デバッグかリリースかを確認できます。

0

Filever.exeを使用できます。

filever.exe <my binary file>
--a-- W32i   APP   -         1.0.0.0 shp     25,600 11-03-2013 <my file>

Fileverを入手するには、WindowsXPのサポートツールをダウンロードできます。

(ほとんどのWindowsユーザーのように)Windows 7以降に移行した場合は、ダウンロードしてwinzipで開くことができます。

次に、support.cabからfileverを抽出します。

Windows7でも問題なく動作します。

0
Idan P