Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

Visual C++ 프로젝트 디버깅 시에 Step-Into(F11) 동작이 원치 않는 함수로 진입하는 것을 막는 방법

말로 설명하는 것보다 직접 한번 실습을 해볼까요? ^^

예를 들어 다음과 같은 코드에서,

#include "stdafx.h"

#include <string>
using namespace std;

void Output(wstring txt)
{
}

int _tmain(int argc, _TCHAR* argv[])
{
    wstring txt = L"TEST";

    Output(txt);

    return 0;
}

Output 함수 실행 부분에 BP(Breakpoint)를 잡고는,

vcpp_breakpoint_0.png

F11(Step-into)키를 눌러 진행하면 어떻게 될까요? 원래 우리가 원하는 동작은 Output 함수로 디버거가 진입하는 것이지만, STL 클래스인 wstring 타입의 생성자로 인해 xstring 파일이 열리면서 basic_string 생성자로 진입하게 됩니다.

vcpp_breakpoint_1.png

함수에 여러 개의 STL 타입이 전달되는 경우면 이것이 여간 짜증나는 일이 아닐 수 없는데요. ^^; 바로 이럴 때 NatStepFilter 파일을 사용하시면 됩니다.

How to Not Step Into Functions using the Visual C++ Debugger
; https://learn.microsoft.com/en-us/archive/blogs/andypennell/how-to-not-step-into-functions-using-the-visual-c-debugger

위의 글에 따라, 다음의 경로에 있는 파일을

C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\Visualizers\default.natstepfilter 

[Visual Studio 2015]
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Packages\Debugger\Visualizers\default.natstepfilter

[Visual Studio 2017 - Enterprise]
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\Packages\Debugger\Visualizers\default.natstepfilter

[Visual Studio 2019 - Enterprise]
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Packages\Debugger\Visualizers\default.natstepfilter 

[Visual Studio 2022 - Enterprise]
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Packages\Debugger\Visualizers\default.natstepfilter

"관리자 권한으로 실행시킨 notepad.exe"에 불러와서 다음과 같이 std 네임스페이스로 시작하는 모든 클래스 정의에 대해 디버거로 하여금 진입을 하지 않도록 설정할 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<StepFilter xmlns="http://schemas.microsoft.com/vstudio/debugger/natstepfilter/2010">

  <Function><Name>std::.*</Name><Action>NoStepInto</Action></Function>


  <Function><Name>__security_check_cookie</Name><Action>NoStepInto</Action></Function>
  ...[생략: 기본적으로 포함된 내용]...
  <Function><Name>operator new</Name><Action>NoStepInto</Action></Function>
</StepFilter>

혹시나, ATL 관련 코드를 자주 만드는 분들이라면 다음의 항목도 추가해 주는 것도 편리할 것입니다.

<?xml version="1.0" encoding="utf-8"?>
<StepFilter xmlns="http://schemas.microsoft.com/vstudio/debugger/natstepfilter/2010">

  <Function><Name>std::.*</Name><Action>NoStepInto</Action></Function>
  <Function><Name>ATL::.*</Name><Action>NoStepInto</Action></Function>


  <Function><Name>__security_check_cookie</Name><Action>NoStepInto</Action></Function>
  ...[생략: 기본적으로 포함된 내용]...
  <Function><Name>operator new</Name><Action>NoStepInto</Action></Function>
</StepFilter>

물론, std/ATL 내부의 코드를 디버깅하고 싶은 코어 개발자라면 위의 설정을 하지 않는 것이 좋습니다.




참고로, Navis 같은 파일은 프로젝트 레벨로 지원이 내려왔는데,

Project Support for Natvis 
; https://devblogs.microsoft.com/cppblog/project-support-for-natvis/

아쉽게도 natstepfilter 파일은 여전히 'Program Files' 폴더 하위에서만 지원합니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 1/26/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2015-10-23 02시14분
정성태
2023-06-09 02시18분
Leverage native step filter files in your C++ project with Visual Studio 17.6!

We now provide added project-level support for .natstepfilter and .natjmc files, on top of the existing support for .natvis.

https://twitter.com/VS_Debugger/status/1666105167022833664?s=20
정성태

... 76  77  78  79  80  81  [82]  83  84  85  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
11928정성태6/5/201920716오류 유형: 543. PowerShell 확장 설치 시 "Catalog file '[...].cat' is not found in the contents of the module" 오류 발생
11927정성태6/5/201921923스크립트: 15. PowerShell ISE의 스크립트를 복사 후 PPT/Word에 붙여 넣으면 한글이 깨지는 문제 [1]
11926정성태6/4/201921274오류 유형: 542. Visual Studio - pointer to incomplete class type is not allowed
11925정성태6/4/201922056VC++: 131. Visual C++ - uuid 확장 속성과 __uuidof 확장 연산자파일 다운로드1
11924정성태5/30/201923622Math: 57. C# - 해석학적 방법을 이용한 최소 자승법 [1]파일 다운로드1
11923정성태5/30/201923213Math: 56. C# - 그래프 그리기로 알아보는 경사 하강법의 최소/최댓값 구하기파일 다운로드1
11922정성태5/29/201920437.NET Framework: 840. ML.NET 데이터 정규화파일 다운로드1
11921정성태5/28/201926978Math: 55. C# - 다항식을 위한 최소 자승법(Least Squares Method)파일 다운로드1
11920정성태5/28/201917041.NET Framework: 839. C# - PLplot 색상 제어
11919정성태5/27/201922659Math: 54. C# - 최소 자승법의 1차 함수에 대한 매개변수를 단순 for 문으로 구하는 방법 [1]파일 다운로드1
11918정성태5/25/201922297Math: 53. C# - 행렬식을 이용한 최소 자승법(LSM: Least Square Method)파일 다운로드1
11917정성태5/24/201923849Math: 52. MathNet을 이용한 간단한 통계 정보 처리 - 분산/표준편차파일 다운로드1
11916정성태5/24/201921870Math: 51. MathNET + OxyPlot을 이용한 간단한 통계 정보 처리 - Histogram파일 다운로드1
11915정성태5/24/201925566Linux: 11. 리눅스의 환경 변수 관련 함수 정리 - putenv, setenv, unsetenv
11914정성태5/24/201924181Linux: 10. 윈도우의 GetTickCount와 리눅스의 clock_gettime파일 다운로드1
11913정성태5/23/201919865.NET Framework: 838. C# - 숫자형 타입의 bit(2진) 문자열, 16진수 문자열 구하는 방법파일 다운로드1
11912정성태5/23/201920457VS.NET IDE: 137. Visual Studio 2019 버전 16.1부터 리눅스 C/C++ 프로젝트에 추가된 WSL 지원
11911정성태5/23/201919634VS.NET IDE: 136. Visual Studio 2019 - 리눅스 C/C++ 프로젝트에 인텔리센스가 동작하지 않는 경우
11910정성태5/23/201928447Math: 50. C# - MathNet.Numerics의 Matrix(행렬) 연산 [1]파일 다운로드1
11909정성태5/22/201923316.NET Framework: 837. C# - PLplot 사용 예제 [1]파일 다운로드1
11908정성태5/22/201922415.NET Framework: 836. C# - Python range 함수 구현파일 다운로드1
11907정성태5/22/201918567오류 유형: 541. msbuild - MSB4024 The imported project file "...targets" could not be loaded
11906정성태5/21/201918885.NET Framework: 835. .NET Core/C# - 리눅스 syslog에 로그 남기는 방법
11905정성태5/21/201919284.NET Framework: 834. C# - 폴더 경로 문자열에서 "..", "." 표기를 고려한 최종 문자열을 얻는 방법 - 두 번째 이야기
11904정성태5/21/201928340.NET Framework: 833. C# - Open Hardware Monitor를 이용한 CPU 온도 정보 [1]파일 다운로드1
11903정성태5/21/201922109오류 유형: 540. .NET Core - System.PlatformNotSupportedException: The named version of this synchronization primitive is not supported on this platform.
... 76  77  78  79  80  81  [82]  83  84  85  86  87  88  89  90  ...