Условные контрольные точки WinDBG для члена значения указателя класса - PullRequest
0 голосов
/ 04 мая 2018

Попытка установить точку останова для члена класса, но я получаю синтаксическую ошибку или ошибку, говорящую "не удалось разрешить".

Целевой переменной является abc указателя класса xyz.

0:000> ??@@c++(xyz->abc)
short 0n812

0:000> dt xyz
Local var @ rbx Type Prop*
   +0x000 __VFN_table : 0x00007ffd`b9229510 
   +0x058 abc          : 0n0147

Попытка:

0:000> bu ***!***::function+0x56 ".if (@@c++(xyz->abc))==147) {.echo 'hit'} .else {gc}"

^ Syntax error in '.if ....'

Я хочу установить точку останова, когда значение pProp-> ydu равно 147.

1 Ответ

0 голосов
/ 04 мая 2018

источник

#include <iostream>
using namespace std;
class Rectangle {
    int width, height;
  public:
    Rectangle (int x ,int y) : width(x) , height(y) {} 
    int area (void) {return (width*height);}
};
void CalcArea(int i,int j,Rectangle *rect) {
    cout << "Area for Rect("<<i<<","<<j<<") = "<<rect->area()<< endl;
}       
int main () {
    int i,j; 
    for(i=10,j=10; (i<100 && j<100); i+=5,j+=10){
        Rectangle rect (i,j);
        CalcArea(i,j,&rect);        
    }
  return 0;
}

скомпилировано с приглашением cmd сообщества против 2017

cl /EHsc /W4 /analyze /Zi /Od classy.cpp /link /release

выполнено

classy.exe
Area for Rect(10,10) = 100
Area for Rect(15,20) = 300
Area for Rect(20,30) = 600
Area for Rect(25,40) = 1000
Area for Rect(30,50) = 1500
Area for Rect(35,60) = 2100
Area for Rect(40,70) = 2800
Area for Rect(45,80) = 3600
Area for Rect(50,90) = 4500

загружается в windbg и устанавливает условную точку останова и запускает

:\>cdb classy.exe
Microsoft (R) Windows Debugger Version 10.0.16299.15 X86

0:000> bu classy!CalcArea ".if(((@@c++(rect->width))==0n40)){ .echo \"hit\" } .else{gc}"

0:000> bl
 0 e 00841100     0001 (0001)  0:**** 
classy!CalcArea ".if(  ((@@c++(rect->width))==0n40)  ) { .echo \"hit\" } .else {gc}"

0:000> g

Area for Rect(10,10) = 100
Area for Rect(15,20) = 300
Area for Rect(20,30) = 600
Area for Rect(25,40) = 1000
Area for Rect(30,50) = 1500
Area for Rect(35,60) = 2100
hit <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
eax=00000028 ebx=7ffdf000 ecx=002dff08 edx=00000046 esi=008c9bf0 edi=000d8b28
eip=00841100 esp=002dfef8 ebp=002dff18 iopl=0         nv up ei ng nz na pe cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000287
classy!CalcArea:
00841100 55              push    ebp


0:000> ?? rect
class Rectangle * 0x002dff08
   +0x000 width            : 0n40  <<<<<<<<<<<<<<<
   +0x004 height           : 0n70
0:000>
...