Условная остановка Windbg не сломается? - PullRequest
0 голосов
/ 27 января 2019

Используя Windbg , я пытаюсь выполнить условное прерывание, используя следующий файл src: basic_thread.cpp :

9:  void __stdcall process()
10: {
11:    unsigned int count = 100000000;
12:    unsigned int hits = 0;
13:    for(unsigned int i = 0; i < count; i++)
14:    {
15:        // Not much to look at.
16:        hits++;
17:    }
18: }

Мои точки останова установлены так:

bu `basic_thread.cpp:12` 
    ".if (poi(count)==0n100000000){.echo 'count==100000000'} .else {gc}"
bu `basic_thread.cpp:16` 
    ".if (poi(hits)==0n500){.echo 'hits==500'} .else {gc}"

После их установки я перезапускаю программу и запускаю, но точки останова никогда не реализуются?

.restart

g

Что не так с моими контрольными точками?

Редактировать

Я прочитал официальный документ здесь , и мои контрольные точки выглядятточные, но они все еще не ломаются.

1 Ответ

0 голосов
/ 28 января 2019

Вы терпите неудачу, потому что вы смешиваете выражение c ++ с выражением MASM.Движок MASM не понимает ваш hits или counts.Вы должны квалифицировать их с помощью синтаксиса @@c++().

Я только что скомпилировал и провел простой тест для имитации того, что вы хотите в своем вопросе:

:\>ls
windbp.cpp

:\>cl /Zi /W4 /Od /analyze /EHsc /nologo windbp.cpp /link /release /nologo
windbp.cpp

:\>cdb -c ".lines;bp `windbp.cpp:16` \".if( @@c++(hits) != 500 ) { gc }\";g" windbp.exe

И результат:

Microsoft (R) Windows Debugger Version 10.0.17763.132 X86

ntdll!LdrpDoDebuggerBreak+0x2c:
773005a6 cc              int     3

0:000> cdb: Reading initial command '.lines;bp `windbp.cpp:16` ".if( @@c++(hits) != 500 ) { gc }";g'
Line number information will be loaded
ModLoad: 6d300000 6d303000   C:\Windows\system32\api-ms-win-core-synch-l1-2-0.DLL
eax=00000500 ebx=7ffd6000 ecx=00000500 edx=00000500 esi=009c8648 edi=00349098
eip=0098102e esp=0028f838 ebp=0028f844 iopl=0         nv up ei ng nz na pe cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000287
windbp!process+0x2e:
0098102e 8b55f8          mov     edx,dword ptr [ebp-8] ss:0023:0028f83c=00000500
0:000> ?? hits
unsigned int 0x500
0:000>

Вот мои образцы:

0:000> lsa .
     8: //space filler
     9: void __stdcall process()
    10: {
    11:    unsigned int count = 100000000;
    12:    unsigned int hits = 0;
    13:    for(unsigned int i = 0; i < count; i++)
    14:    {
    15:        // Not much to look at.
>   16:        hits++;
    17:    }
    18: }
    19:
    20: int main(void) {
    21:     process();
    22:     return 0;
    23: }
0:000>
...