0
I'm currently working on an unmanaged Windows C++ application.
I'm new to the world of CMAKE and C++.
I'm also new to the world of this current unmanaged C++ application.
I'm trying to integrate DevPartner into my build to instrument the build
for memory errors and runtime errors.

インストルメンテーション用にビルドするには、DevPartner コンパイラ (nmcl.exe) を使用するように変更する必要があります。さらに、インストルメンテーションのために既存の CXX_FLAGS にコンパイラ設定を追加する必要があります。

どうすればこれを行うことができますか?

ありがとう、ジョンB

4

3 に答える 3

1

VSリリース2008以前の場合...(VS6を除き、msdevを使用します)

cmakeをさらに掘り下げてみると、知識が豊富な人ならこれを使って実行できるようになると思います。

CLコマンドとLINKコマンドは、VS2003から2008のDevenvとVS2010のMSBuildを開始するだけなので、実際には何も実行されないことがわかりました。MSBuildはターゲットファイルを使用するため、CLをNMCLに変更することは重要ではありません。そのため、他の回答ではユーザーファイルを変更する必要があります。そして、なぜここで別のツールを使用する必要があるのか​​。

/ Buildで呼び出されたDevenvは、プロジェクトファイルを内部的に使用して、ビルドする必要のあるソースファイルを認識します。次に、createprocessを内部的に呼び出して、必要に応じてCLとLINKを生成します。これが、cmakeファイルでCLをNMCLに変更しても意味がない理由です。

幸いなことに、ここで使用できる別のツールがあります。

//プログラムを変更する必要がありますCMAKE_MAKE_PROGRAM:FILEPATH = C:/ Program Files(x86)/ Common Files / Micro Focus / NMShared / CTI / 11.1 / NMdevenv.EXE

およびCMAKE_BUILD_TOOL:INTERNAL = e:/PROGRA~1/MICROS~2.0/Common7/IDE/devenv.com

C:/ Program Files(x86)/ Common Files / Micro Focus / NMShared / CTI / 11.1 / NMdevenv.EXE

ここで、もう少し知識のある人が必要になります。また、インストルメンテーションのタイプを最初のパラメーターとしてnmdevenvに渡す必要があります。

私はそれがこのようなことをすることができると信じています

set(CMAKE_MAKE_PROGRAM "$ {CMAKE_MAKE_PROGRAM}" / nmon ")

ここでのもう1つの問題は、パスにdevenvも含める必要があるため、Pathenv変数も正しく設定する必要があることです。これは、正しいvscvarsbatファイルを実行することで実行できます。

これがお役に立てば幸いです。vs2008以前を使用している場合は、ここで開始した手順に必要な手順を追加してください。長期的には他のユーザーにも役立つと思います。これを調査する時間がもう少しあれば、それを行う方法を見つけるでしょう。

編集 よく私はこれをVS2008で動作させることができました。cmakeがSearchPath機能を破壊していたため、nmdevenvラッパーに変更を加える必要がありました。

これが私がしたことです。上記のようにmakeプログラムを置き換えましたRanVCVars32Ran cmake --buildmytestprojBounsCheckerでプログラムを実行しました

ここで、パフォーマンスプロファイリングのために/ nmtxonを渡すように切り替えました。これにより、エラー検出用にコンパイルし続けるため、少し困惑しました。

そして、それは私が変換されたプロジェクトファイルでこれを見つけたときです

        <Tool
            Name="VCCLCompilerTool"
            AdditionalOptions=" /NMbcon /Zm1000"

これをに変更しました

そして、すべてが順調です。パフォーマンスコンパイルオプションがありました。

そこで、戻ってCMakeCache.txtファイルのこの行を変更して、GUIを開き、構成し、すべてのビルドタイプでコンパイラーが使用する//フラグを生成しました。CMAKE_CXX_FLAGS:STRING = / NMbcon / DWIN32 / D_WINDOWS / W3 / Zm1000 / EHsc / GR

その後、プロジェクトは/NMbconを使用するように切り替えられました。ですから、私たちと一緒にすべてをコンパイルしたいのであれば、それがスイッチを置く正しい場所です。それ以外の場合は、適切なデバッグまたはリリースラインを使用してください。


Cmake出力の一部通知出力のインストルメンテーション

Microsoft (R) Visual Studio Version 9.0.30729.1.
Copyright (C) Microsoft Corp. All rights reserved.
1>------ Build started: Project: Test, Configuration: Debug Win32 ------
1>Compiling...
New Command line nmcl.exe /NMtxon  @e:\cust\Test3\Test\Test.dir\Debug\RSP0000011
2568792.rsp /nologo /errorReport:queue
1>Test3.cpp
1>Instrumenting ..\Test3\Test3.cpp
1>Compiling manifest to resources...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.7600.16385
1>Copyright (C) Microsoft Corporation.  All rights reserved.
1>Linking...

要約すれば

Cmakeを使用してCMakeCache.txtとディレクトリを生成しますCmakeCaheを変更しますMAKEプログラムとしてNMDevenvを使用しますフラグに/NMonスイッチを追加しますCmakeGuiを実行して再度生成します

VCVars32を実行しますcmake--buildファイルを実行します

devpartnerの下でプログラムを実行します

于 2012-10-10T13:32:08.880 に答える
0

cmake ファイルについては 100% 確実ではありませんが、これは Devpartner 用に変更された古い VS 6 makefile からのものです。おそらく、メイクファイルの関連セクションを投稿して、私が見られるようにすることができます。

/nmbcon は、BC インスツルメンテーションを使用することを示すコンパイル フラグです。 /nmtxon は、カバレッジ分析に使用されます。

CPP=cl.exe

CPP_PROJ=/nologo /MD /W3 /Gm /GX /Zi /Od /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WINDLL" /D "_AFXDLL" /D "_MBCS" /D "_AFXEXT " /Fp"$(INTDIR)\main.pch" /Yu"stdafx.h" /Fo"$(INTDIR)\" /Fd"..\bin\Debug\MAIN.pdb" /FD /GZ /c

なるだろう

CPP=nmcl.exe

CPP_PROJ= /nmbcon /nologo /MD /W3 /Gm /GX /Zi /Od /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WINDLL" /D "_AFXDLL" /D "_MBCS" /D "_AFXEXT" /Fp"$(INTDIR)\main.pch" /Yu"stdafx.h" /Fo"$(INTDIR)\" /Fd"..\bin\Debug\MAIN.pdb" /FD /GZ / c

ああ、他のポスターは正しいもので、Visual Studio のバージョンによって大幅に変更されました。VS2010 ではビルド プロセスが MSBuild を使用するように変更されたため、VS2010 と 2012 のインターセプトとインスツルメントの方法を完全に変更する必要がありました。

*編集

さて、私はダウンロードして、今朝のCmakeインターンシップの苦痛を経験しました. VS2010 の場合、コマンド ラインから MSBuild を使用するユーザーの 1 人が必要とするのと同じように、これは非常に単純な変更のようです。

最初のビルド後、out dir "Where to build the binaries" に .vcxproj.user ファイルがあります。これは、インストルメンテーションのフラグを追加する必要がある場所です

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <DevPartner_IsInstrumented>1</DevPartner_IsInstrumented>
    <DevPartner_Instrumented_Type> /NMbcOn</DevPartner_Instrumented_Type>
  </PropertyGroup>
</Project>

これは、構築したい各セクションの繰り返しセクションにすることができます。

次のキー DevPartner_IsInstrumented は、インストルメントする (1) かしない (0) かを示します。最後のキー DevPartner_Instrumented_Type> は、instrumetnt /nmbcon (Boundschecker) /nmtxon (Performance または Coverage) または両方のキーが渡されるタイプです。

だからそれは次のように見えるかもしれません

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <DevPartner_IsInstrumented>1</DevPartner_IsInstrumented>
    <DevPartner_Instrumented_Type> /NMbcOn</DevPartner_Instrumented_Type>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <DevPartner_IsInstrumented>0</DevPartner_IsInstrumented>
    <DevPartner_Instrumented_Type> /NMbcOn</DevPartner_Instrumented_Type>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <DevPartner_IsInstrumented>0</DevPartner_IsInstrumented>
    <DevPartner_Instrumented_Type> /NMbcOn</DevPartner_Instrumented_Type>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <DevPartner_IsInstrumented>1</DevPartner_IsInstrumented>
    <DevPartner_Instrumented_Type> /NtxcOn</DevPartner_Instrumented_Type>
  </PropertyGroup>
</Project>

これは、Debug win32 の Boundschecker、Release win32 の場合、debug x64 の場合、および release x64 の Performance / Coverage の場合は何もありません。

IsInstrumented 0 の場合、型に含まれるものは渡されないため問題ありません。

参考までに、VS2010 でソリューションを開いてインストルメンテーションをオンにすると、vcxproj.user ファイルに追加されます。また、インストルメンテーション設定もプロジェクト/構成ごとに行われます。

VS2010 を使用していない場合、以下の私のメモはそれらのバージョンで正しいかもしれません。

完全な開示のために、私は DevPartner のインストルメンテーション エンジンの主任開発者です。

于 2012-10-10T10:59:26.497 に答える
0

どのバージョンの Visual Studio を使用していますか? 計装の管理方法が長年にわたって変化してきたため、これはかなりの違いを生みます。. . DevPartner のバージョンではなく、Visual Studio のバージョンです。

于 2012-10-09T23:11:09.777 に答える