Π Π°Π·Π½ΠΎΠ΅

Книги ΠΏΠΎ debug: πŸ“• 25 Π»ΡƒΡ‡ΡˆΠΈΡ… ΠΊΠ½ΠΈΠ³ для программистов

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Π Π°Π±ΠΎΡ‚Π° с Debug β€” Β«Π₯Π°ΠΊΠ΅Ρ€Β»

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΡŽΠ½Ρ‹ΠΉ Ρ…Π°ΠΊΠ΅Ρ€! Π’Ρ‹ ΡƒΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ знаСшь, Π½ΠΎ ΠΊΡ€ΡƒΡ‚ΠΎΠΉ Ρ…Π°ΠΊΠ΅Ρ€ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ останавливаСтся Π½Π° достигнутом. Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ посвящСна Ρ€Π°Π±ΠΎΡ‚Π΅ с стандартным Π΄Π΅Π±Π°Π³Π³Π΅Ρ€ΠΎΠΌ систСмы Π”ΠžΠ‘. Π’Ρ‹ скаТСшь: «На ΠΊΠΎΠΉ Ρ„ΠΈΠ³ ΠΌΠ½Π΅ это Π½Π°Π΄ΠΎ ΠΌΠ½Π΅, ΠΊΡ€ΡƒΡ‚ΠΎΠΌΡƒ ΠΏΠ΅Ρ€Ρ†Ρƒ?Β».Β 
ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ: Ρ‚Ρ‹ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡˆΡŒ Π² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹ΠΉ ΠΊΠ»ΡƒΠ± (ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΊΠ°Ρ„Π΅, ΠΊ Π΄Ρ€ΡƒΠ³Ρƒ Π΄ΠΎΠΌΠΎΠΉ), Π° Ρ‚Π°ΠΌ Π½Π° Ρ‚Π°Ρ‡ΠΊΠ΅ дисководы сняты, сидюки Π·Π°ΠΊΠ»Π΅Π΅Π½Ρ‹, Π° ΠΏΠ°ΠΊΠΎΡΡ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ всС ΠΆΠ΅ хочСтся. ЕстСствСнно, Π½Π° любом Β«Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΒ» ΠΊΠΎΠΌΠΏΠ΅ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… компиляторов Π‘, ассСмблСров… Π½ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Β«Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΒ» ΠΊΠΎΠΌΠΏΠ΅ Π΅ΡΡ‚ΡŒ Π”ΠžΠ‘! Π”Π°, ΠΈΠΌΠ΅Π½Π½ΠΎ Π”ΠžΠ‘, ΠΈ Π΅Π³ΠΎ послСдоватСли — Π’ΠΈΠ½Π΄Ρ‹ всСх Ρ‚ΠΈΠΏΠΎΠ² Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π΅Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°
DEBUG.

Как? ΠΠ°Π±Ρ€Π°Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΡƒΡŽ (Ссли Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠ°Π»ΠΎ, Π΄Π° ΠΈ сил ΠΆΠ°Π»ΠΊΠΎ), Π½ΠΎ Π½Π΅ΠΏΡ€ΠΈΡΡ‚Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΊΡƒ, ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π΅ Π½Π° дискС ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² ΠΌΠΎΡ€Π°Π»ΡŒΠ½ΠΎΠ΅ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€Π΅Π½ΠΈΠ΅. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ это дСлаСтся, Π½ΠΎ для Π½Π°Ρ‡Π°Π»Π° ΠΈΠ·ΡƒΡ‡ΠΈΠΌ нСсколько простых, Π½ΠΎ вСсьма ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄.

Π˜Ρ‚Π°ΠΊ, Π²Ρ‹ запустили ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ DEBUG

ΠŸΠ΅Ρ€Π²Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° –D (dump) <adress>.

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° позволяСт ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти, адрСс ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π·Π°Π΄Π°Π½ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ <adress> Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ сСгмСнт:смСщСниС.

Для Π½Π°Ρ‡Π°Π»Π° посмотрим ΠŸΠ—Π£ BIOS:

-d F000:E000

Π—Π΄Π΅ΡΡŒ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Ρ„ΠΈΡ€ΠΌΡƒ-производитСля вашСй
BIOS. А ΠΏΠΎ адрСсу:

-d F000:EC6C

ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ систСмС,
Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠ°ΠΊ Π΄Π°Ρ‚Π° создания Π‘Π˜ΠžΠ‘, чипсСт… А ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΌΡƒ адрСсу
(0000:046C) находится Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π‘Π˜ΠžΠ‘. ΠžΡ‚Ρ‡Π΅Ρ‚Π»ΠΈΠ²ΠΎ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ значСния всС врСмя ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ.
Для программиста ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ сСгмСнты ΠΊΠΎΠΌΠ°Π½Π΄, Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ стСка (CS, DS ΠΈ SS, соотвСтствСнно).

-d DS:0000

Π’Ρ‹ΡˆΠ΅ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ содСрТимоС сСгмСнта Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚. Π΅.
значСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

-d CS:100

А Ρ‚ΡƒΡ‚ прСдставлСно содСрТимоС сСгмСнта ΠΊΠΎΠΌΠ°Π½Π΄, Ρ‚.Π΅. ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Π΅ ΠΊΠΎΠ΄Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄, Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΊ исполнСнию.
Освоив ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ просмотра памяти, впослСдствии ΠΌΡ‹ смоТСм эффСктивно ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ наши ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½Π°ΠΌΠΈ ΠΊΠΎΠ΄ ΠΏΠ΅Ρ€Π΅Π΄ исполнСниСм (для нас сСйчас это приоритСтная Π·Π°Π΄Π°Ρ‡Π°).

Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° ваТная ΠΊΠΎΠΌΠ°Π½Π΄Π° -R (register) <register name>, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ состояниС ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ рСгистра ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ состояниС ΠΈΠ»ΠΈ ΠΆΠ΅ сразу ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΉ выполняСмой ΠΊΠΎΠΌΠ°Π½Π΄Π΅ с просмотром всСх рСгистров.

-r AX

AX 1203
: 0

Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΌΡ‹ просматриваСм рСгистр АΠ₯ ΠΈ ΠΎΡ‡ΠΈΡ‰Π°Π΅ΠΌ Π΅Π³ΠΎ (пишСм Π² Π½Π΅Π³ΠΎ 0).
Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΉ выполняСмой ΠΊΠΎΠΌΠ°Π½Π΄Π΅ (ΠΏΠΎ адрСсу CS:100):

-r

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000
SI=0000 DI=0000Β 
DS=3B9A ES=3B9A SS=3B9A CS=3B9A IP=0100 NV UP EI PL NZ NA PO NCΒ 
3B9A:0100 E82421 CALL 2227

Π’Ρ€Π΅Ρ‚ΡŒΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° –E (enter) Addres <command list>.

ΠŸΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° ΠΎΠ½Π° для измСнСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²
памяти – с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΆΠ΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Ρ… ΠΊΠΎΠ΄Π°Ρ…. Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠΏΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ Π΄Π°Π½Π½Ρ‹Ρ… сначала ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ младший Π±Π°ΠΉΡ‚
(ΠΏΠΎ ΠΌΠ»Π°Π΄ΡˆΠ΅ΠΌΡƒ адрСсу), Π·Π°Ρ‚Π΅ΠΌ – ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ (ΠΏΠΎ ΡΡ‚Π°Ρ€ΡˆΠ΅ΠΌΡƒ), Ρ‚. Π΅.Β 
Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎ адрСсу DS:0000 число 1234h Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ввСсти:

-E DS:0000 34 12

НапримСр Π²Π²Π΅Π΄Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

-E cs:100 B8 34 12
-D CS:100

А с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ U (unassemble) <starting address>, <ending adress> дизассСмблируСм Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ:
-U CS:100,102
3B9A:0100 B83412 MOV AX,1234

Π’Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΈΠ·Π°ΡΡΠ΅ΠΌΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ любой участок памяти, Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ.
Но вмСсто Π²Π²ΠΎΠ΄Π° ΠΊΠΎΠΌΠ°Π½Π΄ Π½Π° машинном языкС, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ встроСнным
ассСмблСром ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ DEBUG. Для этого сущСствуСт ΠΊΠΎΠΌΠ°Π½Π΄Π°
-A (assemble) <adress>. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡƒΠΆΠ΅ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΊΡƒ Π½Π° ассСмблСрС, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΡƒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ дСйствия.:

-AΒ 
0B3B:0100 mov ax,1234
0B3B:0103 mov ah, 4c
0B3B:0105 int 21
0B3B:0107

А ΠΊΠ°ΠΊ ΠΆΠ΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° дискС? Π‘Π½Π°Ρ‡Π°Π»Π° задаСтся имя Ρ„Π°ΠΉΠ»Π°:

-N my_file.com

Π—Π°Ρ‚Π΅ΠΌ Π² рСгистр Π‘Π₯ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Π±Π°ΠΉΡ‚Π°Ρ…. Он Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ разности ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ смСщСний. Π’Π΅ΠΏΠ΅Ρ€ΡŒ остаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ запись Π½Π° диск ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ W ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ записанноС количСство Π±Π°ΠΉΡ‚ΠΎΠ². Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π³ΠΎΡ‚ΠΎΠ²ΡƒΡŽ ΠΊ исполнСнию. Π’Ρ‹Ρ…ΠΎΠ΄ осущСствляСтся ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ q. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

-AΒ 
0B3B:0100 mov ax,1234
0B3B:0103 mov ah, 4c
0B3B:0105 int 21
0B3B:0107Β 
-u CS:100, 106
0B3B:0100 B83412 MOV AX,1234Β 
0B3B:0103 B44C MOV AH,4CΒ 
0B3B:0105 CD21 INT 21Β 
-r cx
CX 0000
:7
-r
AX=0000 BX=0000 CX=0007 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000Β 
DS=0B3B ES=0B3B SS=0B3B CS=0B3B IP=0100 NV UP EI PL NZ NA PO NCΒ 
0B3B:0100 B83412 MOV AX,1234Β 
-N my.com
-W
Π—Π°ΠΏΠΈΡΡŒ 00007 Π±Π°ΠΉΡ‚
-q

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ способ создания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹Π΅ возмоТности для Π»ΡŽΠ±ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… пакостСй, ΠΏΡ€ΠΈΠΊΠΎΠ»ΠΎΠ², Π΄Π° ΠΈ просто программистов-Π»ΡŽΠ±ΠΈΡ‚Π΅Π»Π΅ΠΉ – вСдь Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ для создания Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, вмСсто установки компиляторов, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ стандартными срСдствами систСмы, Π° DEBUG Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² поставку Π²ΠΎ всС Π’ΠΈΠ½Π΄Ρ‹ Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ Π₯Π . Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ вСсСлСС провСсти врСмя Π·Π° Ρ‡ΡƒΠΆΠΈΠΌ ΠΊΠΎΠΌΠΏΠΎΠΌ, вызывая истинноС ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΠ΅ хозяина (дисков ΠΈ дискСт-Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ приносили!!!) Π½ΠΎΠ²Ρ‹ΠΌΠΈ эффСктами Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΅Π³ΠΎ оборудования. УспСхов, ΡŽΠ½Ρ‹Π΅ Π»ΡŽΠ±ΠΈΡ‚Π΅Π»ΠΈ Ρ…Π°ΠΊΠ΅Ρ€Π½ΠΎΠ³ΠΎ экстрима!

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Debug


Главная /
АссСмблСр /
Для Ρ‡Π°ΠΉΠ½ΠΈΠΊΠΎΠ² /
Быстрый старт /


ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Рисунки Π½Π° этой страницС Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ, Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ ΠΈΡ… Π² ΠΊΠ½ΠΈΠ³Π΅.


Как ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ (см. Π’Π’Π•Π”Π•ΠΠ˜Π•),
ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Debug Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состав Windows. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Debug
ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΈΠ»ΠΈ нСпосрСдствСнно ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½Π° находится. Π§Ρ‚ΠΎΠ±Ρ‹
Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈΠ· мСню ПУБК – Π’Π«ΠŸΠžΠ›ΠΠ˜Π’Π¬ ΠΈΠ»ΠΈ
Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ клавиш WIN + R (Ссли Π²Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ комбинация клавиш, см.
ΠΊΠ½ΠΈΠ³Ρƒ ΠšΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ для Ρ‡Π°ΠΉΠ½ΠΈΠΊΠΎΠ²).
Π’ ΠΎΡ‚ΠΊΡ€Ρ‹Π²ΡˆΠ΅ΠΌΡΡ ΠΎΠΊΠ½Π΅ (рис. 1.5) Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΠΉΡ‚Π΅ слово debug ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ENTER ΠΈΠ»ΠΈ Ρ‰Ρ‘Π»ΠΊΠ½ΠΈΡ‚Π΅ ΠΊΠ½ΠΎΠΏΠΊΡƒ ОК.


ПослС этого откроСтся ΠΎΠΊΠ½ΠΎ с пустым экраном ΠΈ Ρ‡Ρ‘Ρ€Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π² Π»Π΅Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ,
которая ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ°Π΅Ρ‚ вас ввСсти ΠΊΠ°ΠΊΡƒΡŽ-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ. НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Debug,
Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΠΉΡ‚Π΅ Π±ΡƒΠΊΠ²Ρƒ q ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ENTER.


ΠΠ°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Debug, ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ СдинствСнным способом, Π½ΠΎ ΠΌΡ‹ ΠΏΠΎΠΊΠ°
рассмотрим Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ большС ΠΏΠΎΡ…ΠΎΠΆ Π½Π° написаниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для
Emu8086.


Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡƒΠΆΠ΅ ΠΈΠ·Π²Π΅ΡΡ‚Π½ΡƒΡŽ Π½Π°ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Debug, сдСлаСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅
(подразумСваСтся, Ρ‡Ρ‚ΠΎ Debug Π²Ρ‹ ΡƒΠΆΠ΅ запустили, ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ экран с малСнькой ΠΌΠΈΠ³Π°ΡŽΡ‰Π΅ΠΉ
Ρ‡Π΅Ρ€Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π² Π»Π΅Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ).


Π’Π²Π΅Π΄Π΅ΠΌ Π±ΡƒΠΊΠ²Ρƒ Β«Π°Β» (напоминаю Π² послСдний Ρ€Π°Π· — всС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ вводятся Π½Π°
английском языкС) ΠΈ Π½Π°ΠΆΠΌΠ΅ΠΌ ENTER.


Π—Π°Ρ‚Π΅ΠΌ Π²Π²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, наТимая ENTER Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки:

 
0B72: 0100 MOV AH, 02
0B72: 0102 MOV DL, 41
0B72: 0104 INT 21
0B72: 0106 INT 20
0B72: 0108

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 1.6.


ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π• 1

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ всС числовыС значСния ΠΏΠΈΡˆΡƒΡ‚ΡΡ Π±Π΅Π· Π±ΡƒΠΊΠΎΠ²ΠΊΠΈ h Π² ΠΊΠΎΠ½Ρ†Π΅. Π­Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ,
Ρ‡Ρ‚ΠΎ Debug Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΌΠΈ числами, ΠΈ Π΅ΠΌΡƒ Π½Π΅ Π½Π°Π΄ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΡ‚ΡŒ,
Π² ΠΊΠ°ΠΊΠΎΠΉ систСмС исчислСния вводятся Π΄Π°Π½Π½Ρ‹Π΅.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π• 2

ПослС Π²Π²ΠΎΠ΄Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ -Π°, ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ символы: 0B72: 0100. Π’ вашСм случаС ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅
символа ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ, Π½ΠΎ нас ΠΎΠ½ΠΈ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚. А ΠΊΠ°ΠΊ Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚
число 0100? ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ ORG 100h (см. Ρ€Π°Π·Π΄Π΅Π»
Emu8086)?
Π’ΠΎΡ‚-Π²ΠΎΡ‚ – это адрСс, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ начинаСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ с
этим адрСсом заносится пСрвая ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (для Ρ„Π°ΠΉΠ»ΠΎΠ² БОМ). КаТдая ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚
2 Π±Π°ΠΉΡ‚Π°, поэтому ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ адрСс Π±ΡƒΠ΄Π΅Ρ‚ 0102 ΠΈ Ρ‚.Π΄.


Π‘Π°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΌΡ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅ΠΌ (см. Ρ€Π°Π·Π΄Π΅Π»
Emu8086),
поэтому ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… здСсь Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ.


ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° написана – Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ. НаТмём ENTER Π΅Ρ‰Ρ‘ Ρ€Π°Π·, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π° экранС
появилась Ρ‡Ρ‘Ρ€Ρ‚ΠΎΡ‡ΠΊΠ°, которая Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ для Debug. Π—Π°Ρ‚Π΅ΠΌ
Π²Π²Π΅Π΄Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ g (ΠΎΡ‚ английского Β«GOΒ») ΠΈ Π½Π°ΠΆΠΌΠ΅ΠΌ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ENTER. На экранС ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:


-g
A
ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π°ΡΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ
-

Π—Π΄Π΅ΡΡŒ A – Ρ‚Π° самая Π±ΡƒΠΊΠ²Π°, которая выводится Π½Π° экран Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.
Π—Π°Ρ‚Π΅ΠΌ ΠΈΠ΄Ρ‘Ρ‚ сообщСниС ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² зависимости
ΠΎΡ‚ вСрсии Debug).


А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли интСрСсно, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² пошаговом Ρ€Π΅ΠΆΠΈΠΌΠ΅, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ
ΠΏΠΎΠ½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΎΠ΄Π½Π° Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Для этого придСтся ΠΏΠΎ Π½ΠΎΠ²ΠΎΠΉ
Π½Π°Π±Ρ€Π°Ρ‚ΡŒ тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ сначала ввСсти ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π°), Π·Π°Ρ‚Π΅ΠΌ:


Π’Π²Π΅Π΄Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ t ΠΈ Π½Π°ΠΆΠΌΠ΅ΠΌ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ENTER. Π£Π²ΠΈΠ΄ΠΈΠΌ Π½Π΅Ρ‡Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ этого:


AX=0200  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B72  ES=0B72  SS=0B72  CS=0B72  IP=0102  NV UP EI PL NZ NA PO NC
0B72:0102 B241		MOV	DL,41

Π­Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½ΠΈ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ состояниС рСгистров процСссора послС выполнСния ΠΏΠ΅Ρ€Π²ΠΎΠΉ
строки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Π² рСгистр АН записалось число 02. Π’ Π½ΠΈΠΆΠ½Π΅ΠΉ
строкС находится адрСс ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ сама ΠΊΠΎΠΌΠ°Π½Π΄Π°, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ.


Π‘Π½ΠΎΠ²Π° Π²Π²Π΅Π΄Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ t ΠΈ Π½Π°ΠΆΠΌΠ΅ΠΌ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ENTER. Π£Π²ΠΈΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:


AX=0200  BX=0000  CX=0000  DX=0041  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B72  ES=0B72  SS=0B72  CS=0B72  IP=0104  NV UP EI PL NZ NA PO NC
0B72:0104 CD21		INT	21

Команда MOV DL, 41, ΠΊΠ°ΠΊ Π΅ΠΉ ΠΈ полагаСтся, записала Π² рСгистр DL число 41.


Π‘Π½ΠΎΠ²Π° Π²Π²Π΅Π΄Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ t ΠΈ Π½Π°ΠΆΠΌΠ΅ΠΌ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ENTER. Π£Π²ΠΈΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:


AX=0200  BX=0000  CX=0000  DX=0041  SP=FFE8  BP=0000  SI=0000  DI=0000
DS=0B72  ES=0B72  SS=0B72  CS=0347  IP=0225  NV UP EI PL NZ NA PO NC
0347:0225 80FC4B	CMP	AH,4B

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ CMP AH,4B Π½Π΅Ρ‚ Π² нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π° свою Ρ€Π°Π±ΠΎΡ‚Ρƒ.
ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ»Π³ΠΎ Π΅Ρ‰Π΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ t – Π½Π°ΠΌ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒΡΡ состояния рСгистров.
ΠŸΠΎΡ‡Π΅ΠΌΡƒ это происходит, Π½Π°ΠΌ ΠΏΠΎΠΊΠ° Π½Π΅ интСрСсно. Π›ΡƒΡ‡ΡˆΠ΅ Π²Π²Π΅Π΄Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ g ΠΈ Π½Π°ΠΆΠΌΠ΅ΠΌ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ENTER,
Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Π½Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΈ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ.


ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° написана ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π°. Но ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ
Ρ„Π°ΠΉΠ» БОМ? Π’Π΅Π΄ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ сдСлали, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Debug. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ
исполняСмый Ρ„Π°ΠΉΠ», Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° нСсколько вопросов:

  1. Какого Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ наш Ρ„Π°ΠΉΠ»? Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ начинаСтся с адрСса 0100h,
    Π° послСдняя строка Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ содСрТит адрСс 0108h. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π°
    Π±ΡƒΠ΄Π΅Ρ‚ 8 Π±Π°ΠΉΡ‚ (108h – 100h = 8).
  2. Как ΠΌΡ‹ Π½Π°Π·ΠΎΠ²Π΅ΠΌ наш Ρ„Π°ΠΉΠ»? А Ρ…ΠΎΡ‚ΡŒ ΠΊΠ°ΠΊ. Однако, рСкомСндуСтся Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Π°ΠΌ английскиС
    ΠΈΠΌΠ΅Π½Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… содСрТится Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 8 символов (DOSΡƒ Ρ‚Π°ΠΊ приятнСС Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ). НазовСм,
    Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, debug_1.com

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:

  1. Π‘Π½ΠΎΠ²Π° напишСм Π½Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ (Ρ‚Ρ€Π΅Π½ΠΈΡ€ΡƒΠΉΡ‚Π΅ΡΡŒ, Ρ‚Ρ€Π΅Π½ΠΈΡ€ΡƒΠΉΡ‚Π΅ΡΡŒ…).
  2. Π—Π°ΠΏΠΈΡˆΠ΅ΠΌ Π² рСгистр Π‘Π₯ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π°. Для этого Π²Π²Π΅Π΄Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ r cx ΠΈ Π½Π°ΠΆΠΌΠ΅ΠΌ ENTER. Π—Π°Ρ‚Π΅ΠΌ Π²Π²Π΅Π΄Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° (8 Π±Π°ΠΉΡ‚) ΠΈ Π½Π°ΠΆΠΌΠ΅ΠΌ ENTER.
  3. Π’Π²Π΅Π΄Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ n, Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ±Π΅Π» ΠΈ имя Ρ„Π°ΠΉΠ»Π°. НаТмСм ENTER.
  4. И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π²Π²Π΅Π΄Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ w ΠΈ Π½Π°ΠΆΠΌΠ΅ΠΌ ENTER.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ всСх этих дСйствий Π½Π° экранС появится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ информация (см. Ρ‚Π°ΠΊΠΆΠ΅ рис. 1.7):


-r cx
Π‘Π₯ 0000
:8
-n debug_1.com
-w
Π—Π°ΠΏΠΈΡΡŒ: 00008 Π±Π°ΠΉΡ‚
-

Если Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ эмуляции DOS ΠΈΠ· ΠΏΠΎΠ΄ WINDOWS, Ρ‚ΠΎ Ρ„Π°ΠΉΠ» debug_1.com
сохранится Π½Π° Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ стол, Π»ΠΈΠ±ΠΎ Π² ΠΏΠ°ΠΏΠΊΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π­Ρ‚ΠΎ зависит ΠΎΡ‚
вСрсии ΠΈ/ΠΈΠ»ΠΈ настроСк WINDOWS. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.
Если Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… ΠΏΠ°ΠΏΠΊΠ°Ρ… Π²Ρ‹ Π½Π΅ нашли этот Ρ„Π°ΠΉΠ», Ρ‚ΠΎ Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π΅Π³ΠΎ Ρ‡Π΅Ρ€Π΅Π· поиск Ρ„Π°ΠΉΠ»ΠΎΠ².
Ну Π° Ссли Π²Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, см. ΠΊΠ½ΠΈΠ³Ρƒ ΠšΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ для Ρ‡Π°ΠΉΠ½ΠΈΠΊΠΎΠ².


Π§ΡƒΠ²ΡΡ‚Π²ΡƒΡŽ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠΆΠ΅ устали. Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Debug осущСствляСтся ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ q.


ΠΠ°Π±Ρ€Π°Π²ΡˆΠΈΡΡŒ сил ΠΈ тСрпСния, ΠΈΠ·ΡƒΡ‡ΠΈΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ ΠΎΠΏΡ†ΠΈΡŽ Debug – дизассСмблСр. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ
ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΈΠ·Π°ΡΡΠ΅ΠΌΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ БОМ-Ρ„Π°ΠΉΠ» (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ дСйствиС, ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅
Π°ΡΡΠ΅ΠΌΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ – ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ исполняСмый Ρ„Π°ΠΉΠ» Π² исходный ΠΊΠΎΠ΄ Π½Π° языкС ассСмблСра).
Допустим, Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΊΠ°, написанная Π½Π΅ Π²Π°ΠΌΠΈ – Π΅Π΅ исходный ΠΊΠΎΠ΄ Π²Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅,
Π° ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ хочСтся. Для этого ΠΈ сущСствуСт дизассСмблСр.


Π˜Ρ‚Π°ΠΊ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Debug Ρƒ нас Π·Π°ΠΊΡ€Ρ‹Ρ‚Π°. НабираСм Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС:


debug debug_1.com

(Π³Π΄Π΅ debug_1.com – это имя Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π΄ΠΈΠ·Π°ΡΡΠ΅ΠΌΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ) ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ ENTER.


ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Если ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ»Π°ΡΡŒ, Π·Π½Π°Ρ‡ΠΈΡ‚ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ Π½Π΅ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€


C:\WINDOWS\COMMAND\debug debug_1.com

Если ΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ»Π°ΡΡŒ, Π½ΠΎ Π²Ρ‹Π΄Π°Π»Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: Ошибка 1282 ΠΈΠ»ΠΈ Β«Π€Π°ΠΉΠ» Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Β»),
Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:


C:\WINDOWS\COMMAND\debug C:\MYPROG\debug_1.com

Если ΠΈ это Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ, Ρ‚ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ всё-Ρ‚Π°ΠΊΠΈ Π³Π΄Π΅-Ρ‚ΠΎ допустили ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² ΠΏΡƒΡ‚ΠΈ ΠΈΠ»ΠΈ
ΠΏΡƒΡ‚ΡŒ Π½Π΅ соотвСтствуСт трСбованиям DOS. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π²
ΠΊΠΎΡ€Π΅Π½ΡŒ диска Π‘, ΠΎΡ‚ΠΊΡƒΠ΄Π° ΠΎΠ½Π° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ загрузится ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ Β«C:\debug_1.comΒ».


Если Debug Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ»Π°ΡΡŒ Π±Π΅Π· сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, Ρ‚ΠΎ Π²Π²ΠΎΠ΄ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ u ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ ENTER.
Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ (ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ, см. Ρ‚Π°ΠΊΠΆΠ΅ рис 1.8):


-u
0BC6:0100 B402		MOV	AH, 02
0BC6:0102 B241		MOV	DL, 41
0BC6:0104 CD21		INT	21
0BC6:0106 CD20		INT	20
0BC6:0108 56		PUSH	SI
0BC6:0109 2E		CS:
0BC6:010A 8A04		MOV	AL, [SI]
0BC6:010C 0AC0		OR	AL, AL
0BC6:010E 741A		JZ	012A
0BC6:0110 3C3A		CMP	AL, 3A
0BC6:0112 750D		JNZ	0121
0BC6:0114 2E		CS:	
0BC6:0115 807C0100	CMP	BYTE PTR [SI+01], 00
0BC6:0119 7506		JNZ	0121
0BC6:011B 2E		CS:
0BC6:011C C60400	MOV 	BYTE PTR [SI], 00
0BC6:011F EB09		JMP 	012A
-

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ строки. Π£Π·Π½Π°Π΅Ρ‚Π΅? Π­Ρ‚ΠΎ наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ строки
нас Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚ (это инструкции, ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈΠ»ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π²ΡˆΠΈΡ…
Π΄ΠΎ запуска Debug). Ну Π° Ссли ΠΌΡ‹ рассматриваСм Π½Π΅Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠ°ΠΊ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Π³Π΄Π΅
кончаСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈ начинаСтся «мусор»? ΠžΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²ΠΎΡ‡Π½ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ
Ρ„Π°ΠΉΠ»Π° (для ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ). Π Π°Π·ΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² свойствах Ρ„Π°ΠΉΠ»Π°.
Волько слСдуСт ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² свойствах Ρ„Π°ΠΉΠ»Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΄Π°Π½ Π² дСсятичной Ρ„ΠΎΡ€ΠΌΠ΅, Π°
Debug Π½Π°ΠΌ Π²Ρ‹Π΄Π°Π΅Ρ‚ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Π΅ адрСса. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ придСтся пСрСвСсти дСсятичноС число
Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠ΅.


Π•ΡΡ‚ΡŒ Π΅Ρ‰Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΎΠΆΠ΅ Π½Π΅ всСгда ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌ) – Π½Π°ΠΉΡ‚ΠΈ Π² ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΌ спискС строку,
ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (INT 20).


Если ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° большая, Ρ‚ΠΎ список Π΅Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ Π½Π΅ помСстится Π½Π° экран. Π’ΠΎΠ³Π΄Π° снова Π²Π²ΠΎΠ΄ΠΈΠΌ
ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ u ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ ENTER. И Ρ‚Π°ΠΊ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.


Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π½Π° экранС свою ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ,
Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΡ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ Π½Π΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ»Π°ΡΡŒ, Π»ΠΈΠ±ΠΎ ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ нСсоотвСтствия адрСсов.
Π‘ΡƒΠ΄ΡŒΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹: ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° адрСса памяти, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π² Π»Π΅Π²ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅.
Наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° начинаСтся с адрСса 0100. Если адрСс Π΄Ρ€ΡƒΠ³ΠΎΠΉ, Ρ‚ΠΎ это, соотвСтствСнно,
Π½Π΅ наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°.

Debug — это… Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Debug?

DebugΒ β€” ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ выполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ². Использовалась ΠΏΡ€ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС MS-DOS. Под Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΠ΅ вСрсии ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· эмулятор MS-DOS ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ возмоТности.

НазначСниС

Данная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° являСтся ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для создания ΠΈΠ»ΠΈ измСнСния ΠΊΠΎΠ΄Π° Ρ„Π°ΠΉΠ»ΠΎΠ². Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ простыС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ MS-DOS ΠΈ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π”Π°Π½Π½Ρ‹ΠΉ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ находится Π½Π° самом Π½ΠΈΠ·ΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ компиляторов assembler. Но ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΈΠΌΠΈ возмоТностями Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ просмотр, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ памяти ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ состояния рСгистров.

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹

Запуск ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° вызываСтся Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку:

DEBUG

DEBUG [[диск:][ΠΏΡƒΡ‚ΡŒ]имя_Ρ„Π°ΠΉΠ»Π° [ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹]]

DEBUG C:\ΠΌΠΎΠΉΠΏΡƒΡ‚ΡŒ\My.com

Π Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ

ΠšΠΎΠΌΠ°Π½Π΄Π°ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠŸΡ€ΠΈΠΌΠ΅Ρ€
-N-N ΠŸΡƒΡ‚ΡŒ_Имя_Π€Π°ΠΉΠ»Π°. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹. Π‘ΠΎΠΊΡ€Π°Ρ‰Ρ‘Π½Π½ΠΎ ΠΎΡ‚ слова Name.-N My.com [ΠΠ°ΠΆΠ°Ρ‚ΡŒ Enter]
-LΠ—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„Π°ΠΉΠ»Π°. Π‘ΠΎΠΊΡ€Π°Ρ‰Ρ‘Π½Π½ΠΎ ΠΎΡ‚ слова Load.-N My.com [ΠΠ°ΠΆΠ°Ρ‚ΡŒ Enter]
-L [ΠΠ°ΠΆΠ°Ρ‚ΡŒ Enter]
-W-W ΠŸΡƒΡ‚ΡŒ_Имя_Π€Π°ΠΉΠ»Π°. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ». Π‘ΠΎΠΊΡ€Π°Ρ‰Ρ‘Π½Π½ΠΎ ΠΎΡ‚ слова Write.-N My.com [ΠΠ°ΠΆΠ°Ρ‚ΡŒ Enter]
-W [ΠΠ°ΠΆΠ°Ρ‚ΡŒ Enter]

 Writing Число_Π‘Π°ΠΉΡ‚ bytes

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ рСгистров

ΠšΠΎΠΌΠ°Π½Π΄Π°ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠŸΡ€ΠΈΠΌΠ΅Ρ€
-RΠ’Ρ‹Π΄Π°Ρ‘Ρ‚ содСрТаниС всСх рСгистров.-R [ΠΠ°ΠΆΠ°Ρ‚ΡŒ Enter]

  AX=D3E0 BX=0000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000  
DS=16BB ES=16BB SS=16BB CS=16BB IP=0100 NV UP DI PL NZ NA PO NC
15A3:0100 30C0 XOR AL,AL
-R [рСгистр]ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ рСгистра ΠΈ запись Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния Π² рСгистр.-R AX [ΠΠ°ΠΆΠ°Ρ‚ΡŒ Enter]

 AX 0000  
666 [ΠΠ°ΠΆΠ°Ρ‚ΡŒ Enter]

Π”Π°ΠΌΠΏ памяти

ΠšΠΎΠΌΠ°Π½Π΄Π°ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠŸΡ€ΠΈΠΌΠ΅Ρ€
-DΠ’Ρ‹Π΄Π°Ρ‘Ρ‚ содСрТимоС памяти. Π‘ΠΎΠΊΡ€Π°Ρ‰Ρ‘Π½Π½ΠΎ ΠΎΡ‚ слова Dump.-D [ΠΠ°ΠΆΠ°Ρ‚ΡŒ Enter]
-D [Начало_Π‘Π΅Π³ΠΌΠ΅Π½Ρ‚Π°] L [ΠšΠΎΠ½Π΅Ρ†_Π‘Π΅Π³ΠΌΠ΅Π½Ρ‚Π°]Π’Ρ‹Π΄Π°Ρ‘Ρ‚ содСрТимоС памяти ΠΎΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ сСгмСнта Π΄ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ сСгмСнта.
Π§Ρ‚ΠΎΠ±Ρ‹ вывСсти всё ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎ ввСсти -D 0 L 0 [ΠΠ°ΠΆΠ°Ρ‚ΡŒ Enter]
-D 0000 L 0005 [ΠΠ°ΠΆΠ°Ρ‚ΡŒ Enter]

 1814:0000 CD 20 FF 9F 00

ДизассСмблированиС

ΠšΠΎΠΌΠ°Π½Π΄Π°ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠŸΡ€ΠΈΠΌΠ΅Ρ€
-UКоманда прСобразования ΠΊΠΎΠ΄Π° Π² инструкции ассСмблСра. Π‘ΠΎΠΊΡ€Π°Ρ‰Ρ‘Π½Π½ΠΎ ΠΎΡ‚ слова Unassemble.-U [ΠΠ°ΠΆΠ°Ρ‚ΡŒ Enter]

 1814:0100 ADD [BX+SI],AL 
1814:0102 XOR AL,00

АссСмблированиС

ΠšΠΎΠΌΠ°Π½Π΄Π°ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠŸΡ€ΠΈΠΌΠ΅Ρ€
-AΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡ инструкции ассСмблСра Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π‘ΠΎΠΊΡ€Π°Ρ‰Ρ‘Π½Π½ΠΎ ΠΎΡ‚ слова Assemble.-A [ΠΠ°ΠΆΠ°Ρ‚ΡŒ Enter]
1814:0100 MOV AX,0009
1814:0103 [Π’Π²ΠΎΠ΄ΠΈΠΌ_Π”Π°Π»ΡŒΡˆΠ΅] [ΠΠ°ΠΆΠ°Ρ‚ΡŒ Enter]

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ

ΠšΠΎΠΌΠ°Π½Π΄Π°ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠŸΡ€ΠΈΠΌΠ΅Ρ€
-GЗапуск исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π‘ΠΎΠΊΡ€Π°Ρ‰Ρ‘Π½Π½ΠΎ ΠΎΡ‚ слова Go.-G [ΠΠ°ΠΆΠ°Ρ‚ΡŒ Enter]

 Program terminated normally
-G =[АдрСс_Начала_Π Π°Π±ΠΎΡ‚Ρ‹]Начиная с этого адрСса начинаСтся компиляция.-G =100
-G [АдрСс_Π‘Ρ€Π΅ΠΉΠΊΠΏΠΎΠΈΠ½Ρ‚Π°] [АдрСс_Π‘Ρ€Π΅ΠΉΠΊΠΏΠΎΠΈΠ½Ρ‚Π°] β€¦ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° запускаСтся ΠΈ выполняСтся ΠΏΠΎΠΊΠ° Π½Π΅ Π΄ΠΎΠΉΠ΄Ρ‘Ρ‚ Π΄ΠΎ Π±Ρ€Π΅ΠΉΠΊΠΏΠΎΠΈΠ½Ρ‚Π°
послС Ρ‡Π΅Π³ΠΎ ΠΎΠ½Π° остановится ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ значСния рСгистров Π΄Π° продолТСния
Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ -G. МаксимальноС число Π±Ρ€Π΅ΠΉΠΊΠΏΠΎΠΈΠ½Ρ‚ΠΎΠ² 10.
-G 176 47d 537 647 [ΠΠ°ΠΆΠ°Ρ‚ΡŒ Enter]

Врассировка

ΠšΠΎΠΌΠ°Π½Π΄Π°ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠŸΡ€ΠΈΠΌΠ΅Ρ€
-TКоманда ΠΈΠΌΠ΅Π΅Ρ‚ сходство с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ (-G) Go, Π½ΠΎ отличаСтся Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎ
Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ значСния рСгистров ΠΏΠΎΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ инструкции. Π‘ΠΎΠΊΡ€Π°Ρ‰Ρ‘Π½Π½ΠΎ ΠΎΡ‚ слова Trace.
-T [ΠΠ°ΠΆΠ°Ρ‚ΡŒ Enter]
-T =[АдрСс_Начала_Π Π°Π±ΠΎΡ‚Ρ‹] [ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ_Π˜ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΉ]Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ с ΠΊΠ°ΠΊΠΎΠ³ΠΎ адрСса Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅
ΠΈ количСство исполняСмых инструкций.
-T =100 5[ΠΠ°ΠΆΠ°Ρ‚ΡŒ Enter]

Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ

Бсылки

Β Β ΠžΠ±Ρ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ MS-DOS ΠΈ Windows
AppendΒ β€’ AttribΒ β€’ BreakΒ β€’ CallΒ β€’ CdΒ β€’ ChcpΒ β€’ ChdirΒ β€’ ChkdskΒ β€’ ClsΒ β€’ CommandΒ β€’ CopyΒ β€’ DateΒ β€’ DebugΒ β€’ DefragΒ β€’ DelΒ β€’ DirΒ β€’ DiskcompΒ β€’ DiskcopyΒ β€’ DoskeyΒ β€’ EchoΒ β€’ EditΒ β€’ EdlinΒ β€’ EraseΒ β€’ ExitΒ β€’ ExpandΒ β€’ FastopenΒ β€’ FcΒ β€’ FindΒ β€’ ForΒ β€’ FormatΒ β€’ GotoΒ β€’ GraphicsΒ β€’ HelpΒ β€’ IfΒ β€’ LabelΒ β€’ LoadfixΒ β€’ MdΒ β€’ MemΒ β€’ MkdirΒ β€’ ModeΒ β€’ MoreΒ β€’ MoveΒ β€’ NlsfuncΒ β€’ PathΒ β€’ PauseΒ β€’ PrintΒ β€’ PromptΒ β€’ RdΒ β€’ RemΒ β€’ RenΒ β€’ RenameΒ β€’ ReplaceΒ β€’ RmdirΒ β€’ SetΒ β€’ SetverΒ β€’ ShareΒ β€’ ShiftΒ β€’ SortΒ β€’ SubstΒ β€’ TimeΒ β€’ TreeΒ β€’ TypeΒ β€’ VerΒ β€’ VerifyΒ β€’ VolΒ β€’ Xcopy
Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅

Debugging tools for Windows / Π₯Π°Π±Ρ€

РаньшС я Π½Π΅ Π·Π½Π°Π», Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сабТ ΠΈ Π½Π΅ ΡƒΠΌΠ΅Π» Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ·Π½Π°Π» ΠΈ Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»Ρ‘Π½. РасскаТу ΠΏΡ€ΠΎ свой ΠΎΠΏΡ‹Ρ‚ общСния с Π½ΠΈΠΌ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ.


Π­Ρ‚ΠΈ Ρ‚ΡƒΠ»Π·Ρ‹ содСрТат ΠΌΠΎΡ‰Π½Ρ‹Π΅ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΈ (WinDbg, Cdb) ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ всякиС полСзности, Ρ‚ΠΈΠΏΠ° создания symservers (symstore.exe), создания Π΄Π°ΠΌΠΏΠ° с процСсса (cdb, windbg), ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΌΠ΅ΠΌΠΎΡ€ΠΈ Π»ΠΈΠΊΠΎΠ² (umdh.exe) ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ошибок Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ (gflags β€” позволяСт Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ «скрытыС» систСмныС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠ°ΠΊ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ exe Ρ„Π°ΠΉΠ»Π°, Ρ‚Π°ΠΊ ΠΈ для всСй систСмы Π² Ρ†Π΅Π»ΠΎΠΌ). Π’Π°ΠΊΠΆΠ΅ Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π΅ Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Ρ‚ΡƒΠ»Π·ΠΎΠ², Ρ‚ΠΈΠΏΠ° просмотрщика debug output.

Π’Π·ΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΡƒΡ‚:Β  ΠœΠ°ΠΉΠΊΡ€ΠΎΡΠ°ΠΉΡ‚

НапримСр, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΠ΅ΠΌΠΎΡ€ΠΈ Π»ΠΈΠΊΠΈ для любой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

Нам понадобится umdh.exe, tlist.exe ΠΈ gflags.exe. ВсС ΠΈΡ… Π½Π°Π΄ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ с админскими ΠΏΡ€Π°Π²Π°ΠΌΠΈ.

ЗапускаСм gflags.exe, выставляСм Π³Π°Π»ΠΎΡ‡ΠΊΡƒ Create user mode stack database. ΠŸΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡΡ β€” Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ для всСх Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ этот database. МоТно для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ прилоТСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ.

Π”Π°Π»Π΅Π΅ запускаСм Π½ΡƒΠΆΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΆΠ΄Π΅ΠΌ, ΠΏΠΎΠΊΠ° всС загрузится ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ PID ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ tlist.exe (ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΡƒΠ³ΠΎΠ΄Π½ΠΎ Π΅Ρ‰Π΅). НапримСр, PID == 111.

Π”Π°Π»Π΅Π΅ запускаСм umdh.exe -p:111 -f:c:\temp\log1.log

Π­Ρ‚Π° строка сохранит Π² Ρ„Π°ΠΉΠ» log1.log ΠΈΠ½Ρ„Ρƒ ΠΎ всСх Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… выдСлСниях памяти Π² процСссС 111.

Π”Π°Π»Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΆΠ΄Π΅ΠΌ сколько-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ снова пишСм:

umdh.exe -p:111 -f:c:\temp\log2.log

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π»ΠΎΠ³ с выдСлСниями памяти.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π»ΠΈΠΊΠΈ:

umdh.exe -d -v -l c:\temp\log1.log c:\temp\log2.log 1> c:\temp\log_result.log

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π² log_result.log Π±ΡƒΠ΄ΡƒΡ‚ всС Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΈ Π½Π΅ освобоТдСнныС куски памяти с калстэками!

Π§Ρ‚ΠΎΠ±Ρ‹ калстэки Π±Ρ‹Π»ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅, Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ enviroment variable _NT_SYMBOL_PATH. Π’ Ρ…Π΅Π»ΠΏΠ΅ написано, ΠΊΠ°ΠΊ Π΅Π³ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ для майкрософтовских exe ΠΈ dll.

Π‘Π²ΠΎΠΈ pdb Π»ΡƒΡ‡ΡˆΠ΅ всСго ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π½Π° symbol server, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΠΎΠ»Π½ΡΡ‚ΡŒ послС Π±ΠΈΠ»Π΄ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ symstore.exe β€” Ρ‚ΠΎΠ³Π΄Π° всСгда ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ pdb.

Если сСрвСра Π½Π΅Ρ‚, ΠΌΠΎΠΆΠ½ΠΎ просто ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ pdb рядом с Π΅Ρ…Π΅ β€” Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Ρ†Π΅ΠΏΠΈΡ‚ΡŒΡΡ. Если Π½Π΅ подцСпится, Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΊ pdb Π² _NT_SYMBOL_PATH.

Если Ρƒ вас Π΅ΡΡ‚ΡŒ Π΄Π°ΠΌΠΏ Ρ„Π°ΠΉΠ» ΠΈ Π½Π°Π΄ΠΎ Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‚ΠΎ ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ ΠΏΡ€ΠΎΡ‰Π΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ WinDbg. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Ρƒ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ _NT_SYMBOL_PATH ΠΈ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ VisualStudio, ΠΎΠ½ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½ΠΈ исходников Π½ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠΎΠ² для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ. ΠŸΡ€ΠΎΡΡ‚ΠΎ Π΄Π°ΠΌΠΏ ΠΈ подходящий pdb! Π—Π°ΠΏΡƒΡΠΊΠ°Π΅ΡˆΡŒ WinDbg.exe, File\open crash dump…, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΡˆΡŒ Π΄Π°ΠΌΠΏ, пишСшь !analyze -v, ΠΏΠΎΡ‚ΠΎΠΌ !uniqstack ΠΈ ΡƒΠΆΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ этого достаточно Π² простых случаях. Π’ΠΈΠ΄ΠΈΡˆΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ pdb нашлись, ΠΊΠ°ΠΊΠΈΠ΅ Π½Π΅Ρ‚ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΡˆΡŒ Π°Π½Π°Π»ΠΈΠ· Π΄Π°ΠΌΠΏΠ°. МоТно ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ окошки с callstack, Processes and threads ΠΈ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ. Если Π½Π°Π΄ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΊΠΎΠ΄ β€” File\Source File Path… β€” ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΊ исходникам ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ мСсто Π² ΠΊΠΎΠ΄Π΅, Π³Π΄Π΅ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ (Π»ΡƒΡ‡ΡˆΠ΅ сразу эти ΠΏΡƒΡ‚ΠΈ ΠΏΡ€ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π² enviroment variable _NT_SOURCE_PATH, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π²Π±ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·). ΠšΠΎΡ€ΠΎΡ‡Π΅, ΠΎΠΏΡΡ‚ΡŒ всС просто ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ссли Π΅ΡΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ pdb πŸ™‚

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с зависаниями Ρ‡Π΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ создания Π΄Π°ΠΌΠΏΠ° зависшСго процСсса. Для этого ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ WinDbg ΠΈΠ»ΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³ΠΈ ΠΈΠ»ΠΈ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ Ρ„ΠΈΡ‡Ρƒ Π² вистС Π² таск ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π΅ β€” ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π°ΠΌΠΏ:)

ΠŸΡ€ΠΈΡ‡Π΅ΠΌ DebuggingTools ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡƒΠΆΠ΅ послС зависания β€” Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π΅ Π½Π°Π΄ΠΎ. Установил β€” снял Π΄Π°ΠΌΠΏ. Для снятия Π΄Π°ΠΌΠΏΠ° ΡŽΠ·Π΅Ρ€Ρƒ Π½Π΅ Π½Π°Π΄ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… pdb.

ΠŸΠΎΡ‚ΠΎΠΌ этот Π΄Π°ΠΌΠΏ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΡˆΡŒ ΠΈ ΠΈΡΠΏΡ€Π°Π²Π»ΡΠ΅ΡˆΡŒ (Π² Windbg Π΅ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для поиска Π΄Π΅Π΄Π»ΠΎΠΊΠΎΠ² ΠΈ Ρ‚.ΠΏ. β€” ΠΊΠΎΠΌΠ°Π½Π΄Π° !locks ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅).

Π’Ρ‹Π²ΠΎΠ΄:

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΎΡ‚Π»Π°Π΄ΠΊΠΎΠΉ, Π½Π°Π΄ΠΎ ΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ систСмой хранСния pdb Ρ„Π°ΠΉΠ»ΠΎΠ² для ΠšΠΠ–Π”ΠžΠ“Πž Π±ΠΈΠ»Π΄Π° Π½Ρƒ ΠΈΠ»ΠΈ хотя Π±Ρ‹ для ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π±ΠΈΠ»Π΄ΠΎΠ². А Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ Debugging tools ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ простыС Ρ€Π΅ΠΊΠΎΠΌΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ тСстСрам ΠΈ программистам β€” Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π² случаС ошибки ΠΈΠ»ΠΈ зависания, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°ΠΌΠΏ, ΠΊΡƒΠ΄Π° Π΅Π³ΠΎ ΠΊΠ»Π°ΡΡ‚ΡŒ ΠΈ с ΠΊΠ°ΠΊΠΈΠΌΠΈ комСнтариями. А Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ тСстСры Π΄Π°ΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ WinDBG ΠΈ ΠΊΠΎΠΏΠΈΠΏΠ°ΡΡ‚ΠΈΡ‚ΡŒ Π² ΠΎΡ‚Ρ‡Π΅Ρ‚ ΠΎ Π±Π°Π³Π΅ ΠΎΡ‚Ρ‚ΡƒΠ΄Π° Π½ΡƒΠΆΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° калстэка с ошибкой β€” ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π² ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ Π°Π½Π°Π»ΠΈΠ·Π΅.

Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π° ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ссылок для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎ WinDBG:
WinDbg. From A to Z!
Common WinDbg Commands (Thematically Grouped)

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ° Python, ΠΎΡ‚Π»Π°Π΄ΠΊΠ° / Π‘Π»ΠΎΠ³ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Mail.ru Group / Π₯Π°Π±Ρ€

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ ΠΎ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠ±Π·ΠΎΡ€ΠΎΠΌ событийных ΠΏΡ€ΠΎΡ„Π°ΠΉΠ»Π΅Ρ€ΠΎΠ².

БСгодня я ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

ΠŸΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ ΠΎΠ± ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ это Ρ‚Π°ΠΊΠΎΠ΅. По Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΈ, обратимся ΠΊ Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ: Β«ΠžΡ‚Π»Π°Π΄ΠΊΠ° β€” ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, локализация ΠΈ устранСниС ошибок». Π’ΠΎΠΎΠ±Ρ‰Π΅, для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ (Π½ΠΎ Π½Π΅ всСгда достаточно) Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ: Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² Ρ‚ΠΎΠΌ мСстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ошибка, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ стСктрСйс: порядок Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠΉ. ПолСзно Ρ‚Π°ΠΊ ΠΆΠ΅ Π·Π½Π°Ρ‚ΡŒ ΠΎΠ± ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ выполняСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°: Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ (ΠΈΠ»ΠΈ отсутствиС) свободной памяти, систСмныС ограничСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° количСство Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов) ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅, Π½ΠΎ это слСгка Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ нашСй ΡΡ‚Π°Ρ‚ΡŒΠΈ.

Классика ΠΆΠ°Π½Ρ€Π°

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉ программист, ΠΊΠΎΠ³Π΄Π° Ρ…ΠΎΡ‡Π΅Ρ‚ Β«ΠΏΡ€ΠΎΠ½ΠΈΠΊΠ½ΡƒΡ‚ΡŒΒ» Π²Π½ΡƒΡ‚Ρ€ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ содСрТимоС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (Π² Π½ΡƒΠΆΠ½Ρ‹Ρ… мСстах) ΠΈ Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ условий)? Он ΠΏΡ€ΠΈΠ±Π΅Π³Π°Π΅Ρ‚ ΠΊ самому распространённому, самому простому ΠΈ самому «дСйствСнному» способу ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ: расставляСт ΠΏΠΎ всСму ΠΊΠΎΠ΄Ρƒ Β«ΠΏΡ€ΠΈΠ½Ρ‚Ρ‹Β» (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ print Π² Python 2.x ΠΈ функция print() Π² Python 3.x). Но Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ Π³Ρ€Π΅ΡˆΠ°Ρ‚ этим: ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Ρ‡Π°ΡΡ‚Π΅Π½ΡŒΠΊΠΎ лСнятся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ инструмСнты для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, надСясь Π±Ρ‹ΡΡ‚Ρ€Π΅Π½ΡŒΠΊΠΎ, Π·Π° ΠΏΠ°Ρ€Ρƒ ΠΌΠΈΠ½ΡƒΡ‚, Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ошибки ΠΈ всё ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ, ΠΈ Π½Π΅ замСчая, Ρ‡Ρ‚ΠΎ поиски ошибок Ρ€Π°ΡΡ‚ΡΠ³ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° часы ΠΈ Π΄Π°ΠΆΠ΅ Π΄Π½ΠΈ. ΠšΡΡ‚Π°Ρ‚ΠΈ, Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Β«ΠΆΡƒΡ€Π½Π°Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌΒ».

Бюда ΠΆΠ΅ относится запись всСй Π½ΡƒΠΆΠ½ΠΎΠΉ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² Π»ΠΎΠ³-Ρ„Π°ΠΉΠ». Иногда Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π½Π΅Ρ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° скрипт Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅ ΠΈ ошибки Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ эпизодичСски, ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° ошибка проявляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Π΄ΠΎΠ»Π³ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (скаТСм, Ρ‡Π΅Ρ€Π΅Π· Π΄Π²Π΅-Ρ‚Ρ€ΠΈ Π½Π΅Π΄Π΅Π»ΠΈ послС запуска).

Но ΠΌΡ‹ ΠΆΠ΅ пишСм Π½Π° Python, Ρ‚Π°ΠΊ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π½Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ встроСнными срСдствами ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈΠ»ΠΈ инструмСнтами, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹ΠΌΠΈ сообщСством? НапримСр, вмСсто ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ логгирования Π² Ρ„Π°ΠΉΠ» ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Sentry, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΡ€ΠΎΠΌΠ΅ сообщСния ΠΎΠ± ошибкС ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ: стСктрСйс со всСми Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ всё, Ρ‡Ρ‚ΠΎ посчитаСтС Π½ΡƒΠΆΠ½Ρ‹ΠΌ.

The Python Debugger

Python ΠΈΠΌΠ΅Π΅Ρ‚ встроСнный ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ: ΠΌΠΎΠ΄ΡƒΠ»ΡŒ pdb. Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, Π½Π° этом ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡŽ, Ρ‚.ΠΊ. pdb β€” Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ ΠΈ всё ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅, ΠΏΠΎ сути, всСго лишь Β«ΡƒΠΊΡ€Π°ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°Β» ΠΊ Π½Π΅ΠΌΡƒ. Но ΠΌΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ =)

Как ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΈΠ· названия, pdb ΠΌΠ½ΠΎΠ³ΠΎΠ΅ взял ΠΎΡ‚ gdb (GNU Project debugger) β€” ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° Π‘ΠΈ (ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ) ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. К слову, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Python ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ gdb, просто это Π½Π΅ΠΌΠ½ΠΎΠΆΠΊΠΎ слоТнСС ΠΈ дольшС, хотя Ρ‚Π΅ΠΌ, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΡƒΠ³Π»ΡƒΠ±ΠΈΡ‚ΡŒΡΡ Π² устройство языка, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ Ρ‚Π΅ΠΌ, ΠΊΡ‚ΠΎ ΠΏΠΈΡˆΠ΅Ρ‚ ΡΠΈΡˆΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ для ΠΏΠΈΡ‚ΠΎΠ½Π° Π±Π΅Π· gdb Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, gdb позволяСт ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ ΡƒΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ (Ρ‡Π΅Ρ€Π΅Π· Π΅Ρ‘ pid) ΠΈ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Π΅Ρ‘ ΠΎΡ‚Π»Π°Π΄ΠΊΠΎΠΉ «прямо Π½Π° мСстС».

Π― сСйчас Π½Π΅ Π±ΡƒΠ΄Ρƒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ pdb, Π²ΠΎΡ‚ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ Π”Π°Π³Π° Π₯Π΅Π»Π»ΠΌΠ°Π½Π½Π° (Doug Hellmann): pdb – Interactive Debugger Π½Π° ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΌ рСсурсС Python Module of the Week, Π° Π²ΠΎΡ‚ Π΅Ρ‘ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π½Π° Ρ…Π°Π±Ρ€Π΅: pdb – Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ xa4a.

IPython pdb

ΠŸΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ сразу ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ IPython ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ipdb для Π½Π΅Π³ΠΎ:

➜ pip install ipython ipdb

IPython (ΠΈ ipdb, ΠΊΠ°ΠΊ Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ) ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Β«Π±ΠΎΠ»Π΅Π΅ Π»ΡƒΡ‡ΡˆΡƒΡŽΒ» консоль ΠΈ, ΠΊΠ°ΠΊ слСдствиС, Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΡƒΡŽ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ: подсвСтка ΠΊΠΎΠ΄Π°, Π°Π²Ρ‚ΠΎΠ΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄, Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈΠ½Ρ‚Ρ€ΠΎΡΠΏΠ΅ΠΊΡ†ΠΈΡŽ Π»ΡŽΠ±Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², магичСскиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, алиасы ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. ΠŸΠΎΠ»Π½Ρ‹ΠΉ список ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ прямо ΠΈΠ· консоли IPython, ввСдя «?» Π² качСствС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Всё это ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Ρ‘ простой ΠΈ ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ.

Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ скрипта Π² ipdb ΠΌΠΎΠΆΠ½ΠΎ нСсколькими способами:

➜ python -m ipdb script.py
➜ ipdb script.py

Π­Ρ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΎΡ‚ΠΊΡ€ΠΎΡŽΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅, дальшС ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ всё, Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ: ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π±Ρ€Π΅ΠΉΠΊΠΏΠΎΠΈΠ½Ρ‚Ρ‹, ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ Π΅Ρ‘ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ шагам ΠΈΠ»ΠΈ просто Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ β€” ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ автоматичСски остановится ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ Π½Π΅ΠΎΡ‚Π»ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

Но ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ чСрСсчур ΠΈΠ·Π½ΡƒΡ€ΠΈΡ‚Π΅Π»Π΅Π½: ΠΏΠΎΠΊΠ° Π΄ΠΎΠ±Π΅Ρ€Ρ‘ΡˆΡŒΡΡ Π΄ΠΎ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ мСста всСми этими Β«nextΒ», Β«stepΒ», Π΄Π° ΠΈ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ останова (Β«breakΒ») Ρ€ΡƒΠΊΠ°ΠΌΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. Π“ΠΎΡ€Π°Π·Π΄ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Π² Π½ΡƒΠΆΠ½ΠΎΠΌ мСстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку:

import ipdb; ipdb.set_trace()

И Ρ‚ΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ исполнСнии этой строки Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ приостановится ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ, β€” дальшС ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ ΡƒΠ³Π»ΡƒΠ±Π»ΡΡ‚ΡŒΡΡ Π² ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. По сути, функция Β«set_traceΒ» β€” это установка Ρ‚ΠΎΡ‡ΠΊΠΈ останова (breakpoint).
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ для эстСтов

Π›ΡŽΠ±ΠΎΠΉ, ΠΊΠΎΠΌΡƒ Π·Π½Π°ΠΊΠΎΠΌΠ° Π°Π±Π±Ρ€Π΅Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° PEP8, Π² этом мСстС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π²ΠΈΠ½ΠΈΡ‚ΡŒ мСня Π² использовании Π΄Π²ΡƒΡ… ΠΊΠΎΠΌΠ°Π½Π΄ Π² ΠΎΠ΄Π½ΠΎΠΉ строкС Ρ‡Π΅Ρ€Π΅Π· Ρ‚ΠΎΡ‡ΠΊΡƒ с запятой, ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π²ΠΏΠΎΠ»Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΎ Π½Π° Тизнь. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, это Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΠΎΠΌΠΌΠΈΡ‡Π΅Π½ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ (ΠΎΠ± этом позаботится ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ…ΡƒΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ провСряСт ΠΊΠΎΠ΄ Π½Π° соотвСтствиС PEP8 ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠΌ ΠΈ ΠΏΡƒΡˆΠ΅ΠΌ, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ Π°Π²Ρ‚ΠΎΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΊΠΎΠ΄Π° Π² тСкстовом Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅). Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ρ‚Π°ΠΊ ΠΏΡ€ΠΎΡ‰Π΅ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ эту строку Π² ΠΊΠΎΠ΄. Ну ΠΈ Π²-Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, ΠΊΠ°ΠΊ написано Π² PEP8: Β«A Foolish Consistency is the Hobgoblin of Little MindsΒ».

Python Debugger ΠΈΠΌΠ΅Π΅Ρ‚ Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях оказываСтся ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Ρ„ΡƒΠΊΠ½Ρ†ΠΈΠΈ set_trace. Он называСтся Β«post mortemΒ»: запуск ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ трСйсбСком:

try:
    some_code()
except:
    import sys
    import ipdb
    tb = sys.exc_info()[2]
    ipdb.post_mortem(tb)

ΠΈΠ»ΠΈ Ρ‚Π°ΠΊ:

import sys
import ipdb


def run_debugger(type, value, tb):
    ipdb.pm()


sys.excepthook = run_debugger
some_code()

Π’ случаС возникновСния Π»ΡŽΠ±Ρ‹Ρ… Π½Π΅ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Β«some_codeΒ» Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ Π² Ρ‚ΠΎΠΌ мСстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π³Π΄Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

debug

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎΠΉ Π·Π°ΠΌΠ΅Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Β«set_traceΒ» являСтся ΠΌΠΎΠ΄ΡƒΠ»ΡŒ debug, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ просто ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ipdb ΠΈ see (удобная Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dir) ΠΈ запускаСт ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ. ЕдинствСнным плюсом модуля являСтся удобство использования, достаточно Π² любом мСстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ строку:

import debug

И ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ этой строки Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ Β«ipdbΒ» ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Β«seeΒ».

ipdbplugin

Π•Ρ‰Ρ‘ ΠΎΠ΄Π½Π° интСрСсная ΠΈ, Π½Π° этот Ρ€Π°Π·, полСзная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°: nose-ipdb. Π‘ Π΅Ρ‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ автоматичСски Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ ΠΏΡ€ΠΈ ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… (ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΡ…) ΠΈΠ»ΠΈ ΠΆΠ΅ просто ΠΏΡ€ΠΈ Π½Π΅Π²Π΅Ρ€Π½ΠΎ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… тСстах (я надСюсь, Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ nose? =). Для запуска ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° ipdb ΠΏΡ€ΠΈ ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, достаточно ΠΏΡ€ΠΈ запускС тСстов Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ «—ipdb»:

➜ nosetests --ipdb

А для запуска ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° ΠΏΡ€ΠΈ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ²ΡˆΠΈΡ…ΡΡ тСстов Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ «—ipdb-failures»:

➜ nosetests --ipdb-failures

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΎΠ²ΠΈΡ‚ΡŒ всё ΠΈ сразу:

➜ nosetests --ipdb --ipdb-failures

Π― ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ дСнь ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΈ просто Π½Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽ сСбС ΠΆΠΈΠ·Π½ΠΈ Π±Π΅Π· Π½Π΅Π³ΠΎ.

werkzeug

ΠŸΠΎΡ‚Ρ€ΡΡΠ°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Армина Π ΠΎΠ½Π°Ρ…Π΅Ρ€Π° (Armin Ronacher), Π°Π²Ρ‚ΠΎΡ€Π° Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Flask ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΡ€ΡƒΡ‚Π΅ΠΉΡˆΠΈΡ… программистов Python называСтся werkzeug ΠΈ прСдставляСт собой сборник Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ для WSGI ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Одна ΠΈΠ· Π½ΠΈΡ… β€” ΠΊΠ»Ρ‘Π²Ρ‹ΠΉ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ трСйсбСк ошибки, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ консоль Python Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ мСстС трСйсбСка прямо Π½Π° страницС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°:

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΎΡ‡Π΅Π½ΡŒ просто, достаточно ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ middleware:

from werkzeug.debug import DebuggedApplication
from myapp import app
app = DebuggedApplication(app, evalex=True)

Говорят, Ρ‡Ρ‚ΠΎ werkzeug ΡƒΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π΄Π°ΠΆΠ΅ Ajax-запросы, Π½ΠΎ, ΠΊ соТалСнию, я сам Π»ΠΈΡ‡Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° этого Π½Π΅ Π΄Π΅Π»Π°Π». Π‘ΡƒΠ΄Ρƒ Ρ€Π°Π΄ Π»ΡŽΠ±Ρ‹ΠΌ коммСнтариям Π½Π° эту Ρ‚Π΅ΠΌΡƒ.

django-pdb

Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, Π½Π° этот Ρ€Π°Π· для Django: django-pdb. Он позволяСт Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ GET-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² запросС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: http://127.0.0.1:8000/app/view?ipdb) Π»ΠΈΠ±ΠΎ для всСх запросов:

➜ python manage.py runserver --ipdb

Π›ΠΈΠ±ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ (Ρ€Π΅ΠΆΠΈΠΌ Β«post-mortemΒ»):

➜ python manage.py runserver --pm

ΠΈΠ»ΠΈ

POST_MORTEM = True

Π² settings.py.

django-extensions

Но Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ Π² Django ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ django-extensions, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ добавляСт ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ runserver_plus. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой Π±Π°Ρ‚Π°Ρ€Π΅ΠΉΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄Ρ€ΡƒΠΆΠΈΡ‚ΡŒ Django ΠΈ Werkzeug (см. Π²Ρ‹ΡˆΠ΅) ΠΈ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΡƒΠ΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²ΠΈΠ΅ ΠΎΡ‚ страниц с пятисотой ошибкой =)

Для использования всСго этого Ρ‡ΡƒΠ΄Π° достаточно Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ дСвСлопСрский сСрвСр с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ runserver_plus:

➜ python manage.py runserver_plus

sentry

ΠžΡ‚Π»Π°Π΄ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² дСвСлопСрском ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ это, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ самоС слоТноС β€” Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΏΠΎ Π±Π°Π³Ρ€Π΅ΠΏΠΎΡ€Ρ‚Ρƒ ΠΎΡ‚ ΠΆΠΈΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Иногда это Π±Ρ‹Π²Π°Π΅Ρ‚ слоТно. НСсмотря Π½Π° всС прСимущСства Python, модуля Β«Ρ‚Π΅Π»Π΅ΠΏΠ°Ρ‚ΠΈΠΈΒ» Π½Π΅ сущСствуСт, ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ остаётся ΠΎΠ΄ΠΈΠ½ Π½Π° ΠΎΠ΄ΠΈΠ½ со словами ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Β«Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚!!!11Β».

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Sentry позволяСт ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с тСкстом ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΏΠΎΠ»Π½Ρ‹ΠΌ стСктрСйсом ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ значСниями всСх Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ стСктрСйса, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ: ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (Π±Ρ€Π°ΡƒΠ·Π΅Ρ€, ОБ), всС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ запроса ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ всё, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΆΠ΅Π»Π°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ.


ΠžΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ошибки Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Π·Π° Β«ΠΏΡƒΠ»ΡŒΡΠΎΠΌΒ» ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ Ρ‡ΠΈΠ½ΠΈΡ‚ΡŒ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ самыС ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹Π΅ мСста. Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования sentry β€” Π»ΠΎΠ³Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. МоТно просто Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² спорноС мСсто запись Π² Π»ΠΎΠ³ сообщСния с Π»ΡŽΠ±Ρ‹ΠΌΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠΌΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, ΠΈ всё это окаТСтся Π² sentry.

Но самый большой плюс Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ всё это ΠΌΠΎΠΆΠ½ΠΎ (ΠΈ Π½ΡƒΠΆΠ½ΠΎ!) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅.

PuDB

Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ интСрСсный ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ: PuDB прСдставляСт собой ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π΄Π΅Π±Π°Π³Π΅Ρ€ с графичСским интСрфСйсом:

НС Π±ΡƒΠ΄Ρƒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎ Π½Ρ‘ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ (чСстно говоря, я сам Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΠΌ Π½Π΅ пользовался), ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΡƒΡŽ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ° Π½Π° Ρ…Π°Π±Ρ€Π΅: Π£Π΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ для Python/Django ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ int22h ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΎΠ±Π·ΠΎΡ€: ΠžΡ‚Π»Π°Π΄ΠΊΠ° Python/Django ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ PuDB.

Winpdb

Standalone ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ Python, Π½Π° этот Ρ€Π°Π· с ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΌ графичСским интСрфСйсом: Winpdb:

Π•Π³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ winpdb Π² 20 Ρ€Π°Π· быстрСС pdb, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Ρ‚Ρ€Π΅Π΄Π°ΠΌΠΈ. ΠžΡ‡Π΅Π½ΡŒ большой ΠΈ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π» ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° этой страницС: code.google.com/p/winpdb/wiki/DebuggingTutorial.

IDE

ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ слова Π·Π°ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Π΅ Β«ΠΊΠΎΠΌΠ±Π°ΠΉΠ½Ρ‹Β» программирования: IDE, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π΅ выходя ΠΈΠ· Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄, ΠΎΡ‚ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ»ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ встроСнный ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ. Π―, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, Π²Ρ‹Π΄Π΅Π»ΡŽ нСсколько ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ², ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° Python: PyCharm, PyDev, Wing IDE ΠΈ PTVS.

ЛиричСскоС отступлСниС

К соТалСнию, Π»ΠΈΡ‡Π½ΠΎ я сколько Π½Π΅ пытался, Ρ‚Π°ΠΊ ΠΈ Π½Π΅ смог ΠΏΠ΅Ρ€Π΅ΡΠΈΠ»ΠΈΡ‚ΡŒ сСбя ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ, ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈ удобство Ρ€Π°Π±ΠΎΡ‚Ρ‹ с консолью ΠΈ Π»ΡŽΠ±ΠΈΠΌΡ‹ΠΌ тСкстовым Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ (Π±ΡƒΠ΄ΡŒ Ρ‚ΠΎ vim, emacs ΠΈΠ»ΠΈ sublime text) Π½Π° Π»ΡŽΠ±ΡƒΡŽ ΠΈΠ· Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Ρ… IDE, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΌΠΎΠΈ ΠΊΠΎΠ»Π»Π΅Π³ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈ поэтому я ΡΠΎΠ²Π΅Ρ‚ΡƒΡŽ хотя Π±Ρ‹ Π΄Π°Ρ‚ΡŒ этим Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°ΠΌ шанс ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ….

Если чСстно, я Π½Π΅ Π²ΠΈΠΆΡƒ особого смысла Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΈΠ· этих IDE, достаточно Π·Π½Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΅ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΡΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ со своими Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ встроСнный ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ прямо ΠΈΠ· Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°, β€” это Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, ΠΊΡ€ΡƒΡ‚ΠΎ ΠΈ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ.

Бпасибо всСм, ΠΊΡ‚ΠΎ Π΄ΠΎΡ‡ΠΈΡ‚Π°Π» ΠΈ ΠΏΡ€ΠΎΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π».

Π’Π»Π°Π΄ΠΈΠΌΠΈΡ€ Π ΡƒΠ΄Π½Ρ‹Ρ…,

ВСхничСский Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠšΠ°Π»Π΅Π½Π΄Π°Ρ€Ρ Mail.Ru.

ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹ΠΉ Debug / Π₯Π°Π±Ρ€

Debug Area β€” полСзная функция Π² Ρ€Π°Π±ΠΎΡ‚Π΅ iOS Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π² Xcode. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΠΎΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΏΠΎΠ΄ iOS, ΠΈ пытаСмся ΠΎΡ‚ΠΎΠΉΡ‚ΠΈ ΠΎΡ‚ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΠΈ любимого print ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΈ Π½Π°ΠΉΡ‚ΠΈ Π±ΠΎΠ»Π΅Π΅ быстрыС ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ понимания состояния систСмы Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π΄Π΅Π±Π°Π³Π° (Debug Area).

Π‘ΠΊΠΎΡ€Π΅Π΅ всСго, Π² Debug панСль ваш взгляд ΡƒΠΏΠ°Π΄Ρ‘Ρ‚ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΌ происходит. ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΠ°Π΄Π΅Π½ΠΈΠΈ прилоТСния Π½ΠΈΠΆΠ½Π΅Π΅ мСню открываСтся автоматичСски, ΠΎΠ½ΠΎ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ для понимания ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ (Вспомним ΡΡ‚Π°Ρ€ΡƒΡŽ Π΄ΠΎΠ±Ρ€ΡƒΡŽ β€œFatal error: Index out of range”), Π² основном Π² самом Π½Π°Ρ‡Π°Π»Π΅ Π²Ρ‹ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΡ‚ нас Ρ…ΠΎΡ‡Π΅Ρ‚ Xcode ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ‚Π΅ΡΡŒ Π³ΡƒΠ³Π»ΠΈΡ‚ΡŒ ошибки, Π½ΠΎ ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ роста всё большС ΠΈ большС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ станСт понятной.

Π‘ самого Π½Π°Ρ‡Π°Π»Π° программист стараСтся ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. Для этого ΠΌΡ‹ стрСмимся ΠΏΠΎΠ½ΡΡ‚ΡŒ Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠ΅Ρ€Π΅ΡˆΠ»Π° Π² Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ состояниС. И Ρ‚ΡƒΡ‚ Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится ΡΠ²ΠΎΠ»ΡŽΡ†ΠΈΡ программиста, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π·Π½ΠΈΡ‚ΡŒΡΡ. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Debug осущСствляСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ β€œprint()”, ΠΏΠΎΡ‚ΠΎΠΌ ΠΈΠ΄Ρ‘Ρ‚ расстановка Breakpoints ΠΈ Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² β€œpo”, Π΄Π°Π»Π΅Π΅ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ с Debug Variable Input (области рядом с консолью Π² Xcode), Π° Π΄Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈ способов компиляции ΠΊΠΎΠ΄Π° Π² процСссС остановки Π½Π° Breakpoint ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² β€” β€œexpression” (По ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, такая Π±Ρ‹Π»Π° ΡΠ²ΠΎΠ»ΡŽΡ†ΠΈΡ Ρƒ мСня).

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°Π·Π½Ρ‹Π΅ способы ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ состояниС нашСго прилоТСния. Π‘Π°ΠΌΡ‹Π΅ простыС Π²Ρ€ΠΎΠ΄Π΅ β€œprint()”, ΠΈ β€œpo” Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ, я Π΄ΡƒΠΌΠ°ΡŽ, Π²Ρ‹ ΠΈ Ρ‚Π°ΠΊ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅ ΠΈΡ… ΡΡƒΡ‚ΡŒ ΠΈ ΡƒΠΌΠ΅Π΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ.

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ простоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΎΠ΄Π½ΠΈΠΌ экраном Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅ΠΌ всСго ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΈΠΏ ячССк (TableViewcell) c двумя элСмСнтами Π²Π½ΡƒΡ‚Ρ€ΠΈ: UIImageView ΠΈ UILabel. Π’ ячСйках Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Ρ‘ порядковый Π½ΠΎΠΌΠ΅Ρ€, Π° Π² ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π»ΠΈΠ±ΠΎ image1, Π»ΠΈΠ±ΠΎ image2.

ΠœΠ΅Ρ‚ΠΎΠ΄ tableViewCellForRowAtIndexPath Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ для нас ячСйки, ΠΏΡ€ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ:


Π”Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ:

Breakpoint

Π”Π°Π²Π°ΠΉΡ‚Π΅ остановим Π½Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ допишСм ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ тСкст Π² наш Label.

1. Π‘Ρ‚Π°Π²ΠΈΠΌ Breakpoint:

2. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° остановила Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° 55 строкС, сразу послС присваивания тСкста. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ находимся Π½Π° строкС, располоТСнной Π² Π·ΠΎΠ½Π΅ видимости ячСйки, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с нашСй ячСйкой.

3. ПишСм Π² консоли ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ тСкст ячСйки:

4. Π£Π±ΠΈΡ€Π°Π΅ΠΌ наш Breakpoint ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹Β».

5. На экранС нашСго Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π° Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ всё ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ:

expression выполняСт Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅.

Edited Breakpoint

Но, Ρ‡Ρ‚ΠΎ Ссли Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ тСкст Π² большом количСствС ячССк? Или ΠΌΡ‹ ΡƒΠΆΠ΅ Π² процСссС выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ поняли, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ?

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ тСкста Π² ячСйки Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π΄ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π΄ΠΎ Breakpoint ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, это сократит ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π΅ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎΠΆΠ΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ячСйки.

Для этого Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ наш Breakpoint, ΠΏΡ€ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚ΡƒΠ΄Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π² Π·ΠΎΠ½Π΅ видимости нашСй ячСйки ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Ρ‘ тСкст ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

  1. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ breakpoint.
  2. Π›Π΅Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ ΠΏΠΎ стрСлочкС breakpoint’a.
  3. НаТимаСм Edit Breakpoint.
  4. Condition β€” условия ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Breakpoint сработаСт, сСйчас ΠΎΠ½ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ΅Π½.
  5. Ignore β€” сколько Ρ€Π°Π· ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Breakpoint ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΠ½ сработаСт (Ρ‚ΠΎΠΆΠ΅ Π½Π΅ Ρ‚ΠΎ).
  6. А Π²ΠΎΡ‚ Action β€” Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°Π΄ΠΎ, Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Ρ‚ΠΈΠΏ дСйствий Debugger Command.
  7. ПишСм Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ:
  8. expression cell.desriptionTextOutlet.text = «\(indexPath.item) mission complete”.
  9. Π‘Ρ‚Π°Π²ΠΈΠΌ Π³Π°Π»ΠΎΡ‡ΠΊΡƒ β€” ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ послС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

9. ΠŸΡ€ΠΎΠ±ΡƒΠ΅ΠΌ.

Π­Ρ‚ΠΎ успСх, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ тСкст для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ячСйки Π²ΠΎ врСмя формирования Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΈ Π½Π°ΠΌ Π½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΆΠ΅Ρ€Ρ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈ ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ.

Breakpoint function

ВсСгда Π±Ρ‹Π²Π°ΡŽΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠ³Π΄Π° Π² нашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ происходит Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ, тСкст Π½Π΅ мСняСтся ΠΈΠ»ΠΈ мСняСтся большС Ρ‡Π΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, казалось Π±Ρ‹ Breakpoint Π² Ρ‚Π°ΠΊΠΎΠΌ случаС ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π΅ΠΊΡƒΠ΄Π°. Но это Π½Π΅ совсСм Ρ‚Π°ΠΊ, Ссли Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ Obj-C, ΠΈ Π·Π½Π°Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ выполняСт компилятор ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π° Π½Π΅Π³ΠΎ Breakpoint ΠΈ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ вызовСтся, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π² процСссС выполнСния Assembler ΠΊΠΎΠ΄Π°.

1. Π’ Breakpoint Π½Π°Π²ΠΈΠ³Π°Ρ‚ΠΎΡ€Π΅ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Symbolic Breakpoint.

2. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ установки тСкста Π² ячСйкС, пишСм -[UILabel setText:].

3. НулСвого Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π½Π΅ сущСствуСт, ΠΈ счСт начинаСтся с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΠΉΠΌΠ°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ Ρ‚ΠΎΡ‚, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ (ΠΎΠ½ устанавливаСм Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя Π² статус Π±Π°Ρ€), Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ°ΠΊ Ρ€Π°Π· наш:

4. Под β€œ$arg1” Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ описаниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

5. Под β€œ$arg2” Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ selector Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

6. Под β€œ$arg3” Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ тСкст ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ.

Ок, с этим Π²Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ понятно. Но ΠΈΠ½ΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ситуации, ΠΊΠΎΠ³Π΄Π° установкой ΠΎΠ΄Π½ΠΎΠ³ΠΎ тСкста Π² статус Π±Π°Ρ€ Π΄Π΅Π»ΠΎ Π½Π΅ ограничиваСтся, ΠΈ Π½Π°Π΄ΠΎ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Π΄Π΅Π»Π°Ρ‚ΡŒ? МоТно Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Breakpoint ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ установили Ρ€Π°Π½Π΅Π΅, Π½ΠΎ установив Π΅Π³ΠΎ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π² ΠΊΠΎΠ΄Π΅. Π§Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚? ΠœΡ‹ Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ наш view появится ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ тСкст Π² ячСйку, Π·Π½Π°Ρ‡ΠΈΡ‚ самоС Ρ‚ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π²ΠΎ viewDidLoad ΠΈΠ»ΠΈ послС создания ячСйки.

Для создания breakpoint ΠΌΡ‹ устанавливаСм Π΅Π³ΠΎ Π½Π° Π»ΠΈΠ½ΠΈΠΈ, ΠΈ Π² action прописываСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

breakpoint set --one-shot true --name "-[UILabel setText:]”

breakpoint set β€”one-shot true β€” создаСм breakpoint
β€”name β€” имя символьного breakpoint
β€œ-[UILabel setText:]” Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄

Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ:

Skip Lines

А Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ Π·Π°ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ какая-Ρ‚ΠΎ строка ΠΊΠΎΠ΄Π° ΠΏΠΎΡ€Ρ‚ΠΈΡ‚ Π½Π°ΠΌ всю ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ? Π’ процСссС выполнСния ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ выполнСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ строки ΠΊΠΎΠ΄Π° Ρ‚Π°ΠΊ:

  1. Π‘Ρ‚Π°Π²ΠΈΠΌ breakpoint Π½Π° строку, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ.
  2. Когда Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ, пСрСтаскиваСм Π΅Π³ΠΎ Π² строку, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Π·Π°Π±Π°Π²Π½ΠΎ, Π½ΠΎ это Π½Π΅ всСгда Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΈΠΆΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π±Π΅Π· пСрСтаскивания).

Π’Π°ΠΊ ΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ пропусканиС строк, β€” это прописываниС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² β€œedit breakpoint”. Команда являСтся рискованной, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΡΡƒΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΡ… скачков β€” это ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒ нас ΠΎΡ‚ Ρ€Π΅Π±ΠΈΠ»Π΄Π°, Π½ΠΎ Ссли Π²Ρ‹ пропуститС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΊ Π½Π΅ΠΌΡƒ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΡƒΠΏΠ°Π΄Ρ‘Ρ‚.

ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΠΌ Π½Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ, ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ячСйкС, для этого Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡΡ‚ΡŒ строк ΠΊΠΎΠ΄Π° ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ячСйку Π±Π΅Π· ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ, для этого Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΌΡ‹ пропускаСм Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… пяти строк ΠΊΠΎΠ΄Π°, ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

Π—Π²ΡƒΡ‡ΠΈΡ‚ довольно Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ, Π½ΠΎ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ всё ΠΆΠ΅ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ хочСтся, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ присвоСния Π² breakpoint:

Удачная комбинация, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ячСйкС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΈΠΏ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ.

Watchpoint

Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° удобная функция Π² Π΄Π΅Π±Π°Π³Π΅Ρ€Π΅ β€” это отслСТиваниС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, watchpoints. Watchpoint Ρ‡Π΅ΠΌ Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° KVO, ΠΌΡ‹ ставим breakpoint Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ состояния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ мСняСт своё состояниС, процСсс выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ останавливаСтся, ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ мСста, ΠΎΡ‚ΠΊΡƒΠ΄Π° ΠΈ ΠΊΠ΅ΠΌ Π±Ρ‹Π»ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. НапримСр, я поставил watchpoint Π½Π° ячСйку, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ происходит Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ листания Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΠΎΠ²ΠΎΠΉ ячСйки. Бписок ΠΊΠΎΠΌΠ°Π½Π΄ получился ΠΎΡ‡Π΅Π½ΡŒ большой, поэтому Π΅Π³ΠΎ я ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Ρƒ просто упомяну Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅: выполнСния layout view находящихся Π²Π½ΡƒΡ‚Ρ€ΠΈ ячСйки ΠΈ простановка constraint, анимация, простановка состояний для ячСйки ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅-ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅.

Для простановки watchpoint Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ breakpoint Π² области видимости свойств, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ, Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ свойство Π² β€œdebug variable” ΠΏΠ°Π½Π΅Π»ΠΈ ΠΈ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ watch β€œ<ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€>”.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΡΠ½ΡΡ‚ΡŒ watchpoint с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π°Π΄ΠΎ Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² breakpoint navigator, Ρ‚Π°ΠΌ вмСстС с ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ breakpoint Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΈ наш watchpoint.

Breakpoint UI Change

Иногда Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎΠ± ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ пытаСмся ΠΎΡ‚Π΄Π΅Π±Π°ΠΆΠΈΡ‚ΡŒ. Π‘Π°ΠΌΡ‹ΠΉ простой Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€” это ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ β€œpo”, для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, ΠΈ Ρ‚Π°ΠΌ ΠΆΠ΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° располоТСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² памяти. Но Π±Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΠΈΠΌΠ΅Π΅ΠΌ прямой ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΎΠ½ Π½Π΅ прСдставлСн Π² API view, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π»Π΅ΠΆΠΈΡ‚ ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ скрыт Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ. Один ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ View Hierarchy, Π½ΠΎ это Π½Π΅ всСгда ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π΄Π° ΠΈ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ нашли Π½ΡƒΠΆΠ½Ρ‹ΠΉ view Π½Π΅ всСгда слоТно. МоТно ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

expression self.view.recursiveDescription()

Она Π΅ΡΡ‚ΡŒ Π² Obj-C Π½ΠΎ Π² Swift Π΅Ρ‘ ΡƒΠ±Ρ€Π°Π»ΠΈ ΠΈΠ· Π·Π° особСнностСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ языка Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΌΡ‹ Π΅Ρ‘ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ, Π½ΠΎ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π° Debuger Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Obj-C, Π² Ρ‚Π΅ΠΎΡ€ΠΈΠΈ Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΡ€ΠΌΠΈΡ‚ΡŒ эту ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, ΠΈ ΠΎΠ½ ΠΏΠΎΠΉΠΌΡ‘Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΎΡ‚ Π½Π΅Π³ΠΎ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅. Для выполнСния ΠΊΠΎΠ΄Π° Obj-C Π² консоли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ввСсти ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

expression -l objc -O - - [`self.view` recursiveDescription] 

Π§Ρ‚ΠΎ Π²Ρ‹ Ρ‚ΡƒΡ‚ Π²ΠΈΠ΄ΠΈΡ‚Π΅? Π― Π²ΠΈΠΆΡƒ довольно Π½Π΅ ΡƒΠ΄ΠΎΠ±Π½ΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ½ΡƒΡ‚ΡŒ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ, Π½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ этого Π΄Π΅Π»Π°Ρ‚ΡŒ, Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ typealias для упрощСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

command alias poc expression -l objc -O β€”

Π’Π΅ΠΏΠ΅Ρ€ΡŒ наша ΠΊΠΎΠΌΠ°Π½Π΄Π° сокращаСтся ΠΈ упрощаСтся, Π½ΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ:

poc [`self.view` recursiveDescription]

Π‘ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ послС закрытия Xcode ΠΈΠ»ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅? Π£Π²Ρ‹, Π½Π΅Ρ‚. Но это ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ! Π‘ΠΎΠ·Π΄Π°Π² Ρ„Π°ΠΉΠ» .lldbinit ΠΈ вписав Ρ‚ΡƒΠ΄Π° наш alias. Если Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅ ΠΊΠ°ΠΊ, Π²ΠΎΡ‚ инструкция ΠΏΠΎ ΠΏΡƒΠ½ΠΊΡ‚Π°ΠΌ:

1. Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚Π΅ Ρ„Π°ΠΉΠ» .lldbinit (Π² качСствС ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π·ΡΡ‚ΡŒ .gitignore, ΠΎΠ½ относится ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Ρ‚ΠΈΠΏΡƒ тСкстовых Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²).

2. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² этом Ρ„Π°ΠΉΠ»Π΅ Ρ€ΠΎΠ²Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

 command alias poc expression -l objc -O - -	


3. Π€Π°ΠΉΠ» помСститС Π² ΠΏΠ°ΠΏΠΊΡƒ ΠΏΠΎ адСсу β€œMacintoshHD/Users/”.

И Ρ‚Π°ΠΊ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ описаниС всСх view, прСдставлСнных Π½Π° экранС. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ смоТСм ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с адрСсом ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² памяти. Для Swift Ρ‚ΡƒΡ‚ имССтся ΠΌΠ΅Ρ‚ΠΎΠ΄ с нСдостатоком, Π½Π°Π΄ΠΎ всё врСмя ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² памяти ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ:

po unsafeBitCast(0x105508410, to: UIImageView.self)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ нашСй ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π² ячСйкС, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π΅Ρ‘ ΠΏΠΎΠ΄Π²ΠΈΠ½Π΅ΠΌ Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΎΠ½Π° Π±Ρ‹Π»Π° ΠΏΠΎ Ρ†Π΅Π½Ρ‚Ρƒ ячСйки ΠΈ ΠΈΠΌΠ΅Π»Π° отступ с Π±ΠΎΠΊΡƒ 20 px.

Π‘Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ сразу Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ½ΡΡ‚ΡŒ с debug ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Π±Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅.

Но Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π΅Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ячСйки, Π½Π°Π΄ΠΎ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° Python нСсколько скриптов ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° нас (ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ скрипты ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ здСсь www.raywenderlich.com/612-custom-lldb-commands-in-practice), ΠΈ Ссли Π²Ρ‹ ΡƒΠΌΠ΅Π΅Ρ‚Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ с Python ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° Π½Ρ‘ΠΌ для lldb Ρ‚ΠΎ Π²Π°ΠΌ ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ.

Π― ΠΆΠ΅ Ρ€Π΅ΡˆΠΈΠ» Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ для класса UIView, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ просто Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒ view Π² Π½ΡƒΠΆΠ½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ, ΠΌΠ½Π΅ показалось Ρ‚Π°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ мСньшС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π½ΠΎΠ²Ρ‹Ρ… скриптов ΠΊ LLDB ΠΈ Π½Π΅ слоТно для любого iOS программиста (ΠΈΠ½Π°Ρ‡Π΅ Π½Π°Π΄ΠΎ ΠΎΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ Python для LLDB).

Π― Π½Π΅ стал ΠΈΡΠΊΠ°Ρ‚ΡŒ мСсто ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² памяти ΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ класс, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΌ Π²Π·ΡΡ‚ΡŒ frame, это Ρ‚Π°ΠΊ ΠΆΠ΅ Π·Π°ΠΉΠΌΠ΅Ρ‚ слишком ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Вопрос Ρ€Π΅ΡˆΠΈΠ»ΡΡ написаниСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ UIView:

К соТалСнию, ΠΎΠ½Π° ΠΏΠ»ΠΎΡ…ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ячСйками, скорСС всСго ΠΈΠ· Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ исполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ flush Π½Π΅ всС ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ячСйки просчитаны ΠΈ ΠΎΠ½Π° Π½Π΅ появилась Π½Π° экранС (ΠΌΡ‹ ΠΏΠΎΠΊΠ° Π½Π΅ Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ tableViewCell). Π‘ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ статичСскими элСмСнтами ΠΎΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ.

Зная ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ view Π² ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ доступ ΠΈ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ обратная ситуация, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ViewHierarchy ΠΈ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡ‚Ρ‚ΡƒΠ΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ view. Π’ Xcode Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ view Π² процСссС выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚Π°ΠΊ ΠΆΠ΅ Ρ‚Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚Π°, располоТСниС, Ρ‚ΠΈΠΏΡ‹ ΠΈ привязки ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Π² Ρ‚ΠΎΠΌ числС. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ constraints нашСго UIImageView.

Для получСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΎ constraint:

1. НаТмитС Π½Π° Debug View Hierarchy.

2. Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Clipped Content Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ Π²Π½ΠΈΠ·Ρƒ появившСгося экрана.

3. Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Constraints Π½Π° Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΠ°Π½Π΅Π»ΠΈ.

4. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Contraint.

5. Π’ мСню Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Edit -> Copy (Command + C).

6. ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ привязка Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°: ((NSLayoutConstraint *)0x2838a39d0).

7. И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΌΡ‹ мСняСм Π΅Ρ‘ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠ΄ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈ Π² lldb:
expression [((NSLayoutConstraint *)0x2838a39d0) setConstant: 60]

8. ПослС наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ, элСмСнт ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ своё ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° экранС.

Π’Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ†Π²Π΅Ρ‚Π°, тСкст ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅:

expression [(UILabel *)0x102d0a260] setTextColor: UIColor.whiteColor]

Demo ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ получился слишком простым (60 строк ΠΊΠΎΠ΄Π° Π²ΠΎ ViewController), Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я написал, прСдставлСна Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ слоТности Π² воспроизвСдСнии тСстового ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚.

P.S.: Если Π΅ΡΡ‚ΡŒ вопросы ΠΈΠ»ΠΈ замСчания ΠΏΠΈΡˆΠΈΡ‚Π΅. ΠŸΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΠΉΡ‚Π΅ WWDC ΠΈ Π”Π΅Π±Π°ΠΆΡ‚Π΅ ΠΊΠ°ΠΊ Pro.

Π‘ΠΎΠ²Π΅Ρ‚ΡƒΡŽ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π°ΠΌΠΈ:

Вдохновлялся Advanced Debugger WWDC 18 Session
ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ Debugger
Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ скриптов Python Π² LLDB Xcode

AVR. Π£Ρ‡Π΅Π±Π½Ρ‹ΠΉ ΠšΡƒΡ€Ρ. ΠžΡ‚Π»Π°Π΄ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π§Π°ΡΡ‚ΡŒ 2

ΠœΠ΅Ρ‚ΠΎΠ΄ 2. ΠœΠΎΡ€Π³Π°Π»ΠΊΠΈ (Π Π°Π±ΠΎΡ‚Π° ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ Π’Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°)

Врассировка ΠΈ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ° это всС Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎ внСшнСС, Ρ‚ΠΎ Ρ‚ΡƒΡ‚ трассировка Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ°Π»ΠΎ. Π’.ΠΊ. Π³Π»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ, Π° снаруТи.
Β 

Π›ΠΈΠ±ΠΎ Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ глюк, Π° банальноС Π½Π΅ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ситуации. Π€Ρ€Π°Π·Ρƒ ΠΈΠ· Π΄Π°Ρ‚Π°ΡˆΠΈΡ‚Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π²Π΅Π» ΠΈΠ»ΠΈ Π³Π»Π°Π· замылился. Π§Ρ‚ΠΎ Ρ‚ΠΎ Π·Π°Π±Ρ‹Π» ΠΈΠ»ΠΈ Π½Π΅ Ρ‚ΡƒΠ΄Π° припаял. Π”Π° ΠΌΠ°Π»ΠΎ Π»ΠΈ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΊΠΎΡΡΡ‡ΠΈΡ‚ΡŒ.
Β 

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈΠ·-Π·Π° ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. А Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π³Π΄Π΅ косяк Π½Π°Π΄ΠΎ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ ΠΈ Π·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€ΠΈ. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.
Β 

ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Π½Π°ΠΌ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ происходит ΠΏΠΎΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎ β€” это ΠΌΡ‹ ΠΈΠ»ΠΈ трСйсом ΠΈΠ»ΠΈ Ρ‚ΡƒΠΏΠ»Π΅Π½ΠΈΠ΅ΠΌ ΠΎΡ‚Π»Π°Π΄ΠΈΠΌ. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Π΅ΠΉ Π·Π½Π°Ρ‚ΡŒ ΠΊΡƒΠ΄Π° ΡƒΡˆΠ»Π° ΠΏΡ€ΠΎΠ³Π°.
Β 

Π‘Π°ΠΌΡ‹ΠΌ простым ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Ρ‚ΡƒΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄. ВсС просто β€” ΠΌΡ‹ Π±Π΅Ρ€Π΅ΠΌ ΠΈ опрСдСляСм ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ² ΠΏΠΎΠ΄ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Π΄Π°ΠΆΠ΅ Ссли Ρƒ нас какая-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΊΡ€ΠΎΡˆΠ΅Ρ‡Π½Π°Ρ Ρ‚ΠΈΠ½ΡŒΠΊΠ° ΠΈ всС Π²Ρ‹Π²ΠΎΠ΄Ρ‹ расписаны Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ ΠΏΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π°Π·, Ρ‚ΠΎ всС Ρ€Π°Π²Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΎΠ΄ΠΈΠ½ лишний Π²Ρ‹Π²ΠΎΠ΄ β€” достаточно Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚, Π½ΠΎ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ нас Π½Π΅ интСрСсуСт.
Β 

А Ρƒ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Ρ€ΠΈ состояния β€” Hi, Lo ΠΈ Hi-Z. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΡΠΊΡ€Π΅Π°Ρ‚ΠΈΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Π²ΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π½ΠΈΡ‡Π΅ΠΊ:
Β 

Β 

Π’ΠΎΠ³Π΄Π° Ссли Ρƒ нас Hi-Z Ρ‚ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚ΡƒΡΠΊΠ»Π΅Π½ΡŒΠΊΠΎ Π³ΠΎΡ€Π΅Ρ‚ΡŒ ΠΎΠ±Π° Π΄ΠΈΠΎΠ΄Π°. Ну, Π° Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ свой Π΄ΠΈΠΎΠ΄ Π² Π³ΠΎΡ€Π΄ΠΎΠΌ одиночСствС.
Β 

А Π² ΠΊΠΎΠ΄ ΠΏΠΈΡ…Π°Π΅ΠΌ Π΄Π΅Π±Π°ΠΆΠ½Ρ‹Π΅ сСкции Π²ΠΈΠ΄Π°:
Β 

1
2
3
;Set Hi
	SBI	DEBUGDDR,DEBUG
	SBI	DEBUGPORT,DEBUG

;Set Hi
SBI DEBUGDDR,DEBUG
SBI DEBUGPORT,DEBUG

1
2
3
;Set Lo
	SBI	DEBUGDDR,DEBUG
	CBI	DEBUGPORT,DEBUG

;Set Lo
SBI DEBUGDDR,DEBUG
CBI DEBUGPORT,DEBUG

1
2
3
;Set Hi-Z
	CBI	DEBUGDDR,DEBUG
	CBI	DEBUGPORT,DEBUG

;Set Hi-Z
CBI DEBUGDDR,DEBUG
CBI DEBUGPORT,DEBUG

Β 

МоТно ΠΈΡ… Π² макросы Π·Π°Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ. Π£Π΄ΠΎΠ±Π½Π΅ΠΉ Π±ΡƒΠ΄Π΅Ρ‚.
Β 

По ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ Π΄Π΅Π±Π°Π³ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² ΠΊΠ°ΠΊΠΎΠΌ мСстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΎΡˆΠ»Π°. А комбинируя Π½Π°ΡˆΡƒ Ρ‚Ρ€ΠΎΠΈΡ‡Π½ΡƒΡŽ систСму ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ†Π΅Π»Ρ‹Ρ… 9 Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ Π½Π° 2 Π²Ρ‹Π²ΠΎΠ΄Π°.
Β 

Однако Ссли Ρƒ нас Π½Π°Π΄ΠΎ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈ Π½Π΅ ΡƒΡΠΏΠ΅Ρ‚ΡŒ Ρ€Π°Π·Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ³ΠΈΠ²Π°Π½ΠΈΠ΅ свСтиков. Но Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π²ΠΎΡ‚ΠΊΠ½ΡƒΡ‚ΡŒ Π² ΠΊΠΎΠ΄ послС смСны состояния Π΄Π΅Π±Π°Π³Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚ΡƒΠΏΡƒΡŽ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ Π²ΠΈΠ΄Π°:
Β 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
	PUSHF			; ΠœΠ°ΠΊΡ€ΠΎΡ сохранСния Ρ„Π»Π°Π³ΠΎΠ²
	PUSH 	R16
	PUSH	R17
	PUSH	R18
Β 
	LDI	R16,255	; Π“Ρ€ΡƒΠ·ΠΈΠΌ Ρ‚Ρ€ΠΈ Π±Π°ΠΉΡ‚Π°
	LDI	R17,255	; НашСй Π²Ρ‹Π΄Π΅Ρ€ΠΆΠΊΠΈ
	LDI	R18,255
Β 
Dloop:	SUBI	R16,1		; Π’Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌ 1
	SBCI	R17,0		; Π’Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π‘
	SBCI	R18,0		; Π’Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π‘
Β 
	BRCC	DLoop 		; Если Π½Π΅Ρ‚ пСрСноса - ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄
Β 
	POP	R18
	POP	R17
	POP	R16
	POPF			; ΠœΠ°ΠΊΡ€ΠΎΡ восстановлСния Ρ„Π»Π°Π³ΠΎΠ²

PUSHF ; ΠœΠ°ΠΊΡ€ΠΎΡ сохранСния Ρ„Π»Π°Π³ΠΎΠ²
PUSH R16
PUSH R17
PUSH R18

LDI R16,255 ; Π“Ρ€ΡƒΠ·ΠΈΠΌ Ρ‚Ρ€ΠΈ Π±Π°ΠΉΡ‚Π°
LDI R17,255 ; НашСй Π²Ρ‹Π΄Π΅Ρ€ΠΆΠΊΠΈ
LDI R18,255

Dloop: SUBI R16,1 ; Π’Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌ 1
SBCI R17,0 ; Π’Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π‘
SBCI R18,0 ; Π’Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π‘

BRCC DLoop ; Если Π½Π΅Ρ‚ пСрСноса — ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄

POP R18
POP R17
POP R16
POPF ; ΠœΠ°ΠΊΡ€ΠΎΡ восстановлСния Ρ„Π»Π°Π³ΠΎΠ²

Β 

ΠžΡ„ΠΎΡ€ΠΌΠ»ΡΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ минимальноС влияниС Π½Π° ΠΊΠΎΠ΄. МоТно Ρ‚ΠΎΠΆΠ΅ ΠΎΡ„ΠΎΡ€ΠΌΠΈΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ макроса ΠΈ Π²Ρ‚Ρ‹ΠΊΠ°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΎΠ΄Π½ΠΎΠΉ строчкой. Π—Π°ΠΏΡ€Π΅Ρ‚ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ.
Β 

Π›ΠΈΠ±ΠΎ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π·Π°Ρ‚ΡƒΠΏ:

Β 

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ Π½Π° этой ΠΊΠΎΠΌΠ°Π½Π΄Π΅ встанСт ΠΈ дальшС Π½ΠΈΠΊΡƒΠ΄Π° Π½Π΅ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ (ΠΏΡ€Π°Π²Π΄Π° Ссли Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Π²Π°Ρ‡Π΄ΠΎΠ³, Ρ‚ΠΎ ΠΎΠ½ рСбутнСтся ΠΏΠΎ Π²Π°Ρ‡Π΄ΠΎΠ³Ρƒ).
Β 

А ΠΌΠΎΠΆΠ½ΠΎ ΠΆΠ΅ сразу послС Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ пСрСвСсти ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ Π² Ρ€Π΅ΠΆΠΈΠΌ Π²Ρ…ΠΎΠ΄Π° PullUp ΠΈ ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΏΡ€ΠΎΠ±Π½ΠΈΠΊΠ°. Если Π½Π°ΠΆΠ°Ρ‚Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ΄Ρ‚ΠΈ дальшС. МоТно ΠΈ Π±Π΅Π· Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π½ΠΎ Π½Π°Π΄ΠΎ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Ρ€Π΅Π±Π΅Π·Π³ Π½Π΅ помСшал.
Β 

1
2
3
4
5
6
;STOP DB_BTN
	CBI	DEBUGDDR,DEBUG
	SBI	DEBUGPORT,DEBUG	
Β 
	SBIC	DEBUGPIN,DEBUG
	RJMP	PC-1

;STOP DB_BTN
CBI DEBUGDDR,DEBUG
SBI DEBUGPORT,DEBUG

SBIC DEBUGPIN,DEBUG
RJMP PC-1

Β 

МоТно просто Π½Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ½ΠΎΠΏΠΎΡ‡Π½Ρ‹Ρ… Ρ‡Π΅ΠΊΠΏΠΎΠΈΠ½Ρ‚ΠΎΠ². И ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΏΠΎ Π½ΠΈΠΌ своСй ΠΌΠΎΠ³ΡƒΡ‡Π΅ΠΉ Π²ΠΎΠ»Π΅Π²ΠΎΠΉ Ρ€ΡƒΠΊΠΎΠΉ. А ΠΏΠΎΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ‚ΡƒΠΏΠΈΡ‚ Π½Π° Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°Ρ… ΠΈΠ»ΠΈ оТиданиях ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΌΠΎΠΆΠ½ΠΎ спокойно Π·Π°ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ напряТСния/ΠΏΠΎΡ‰ΡƒΠΏΠ°Ρ‚ΡŒ Π»ΠΎΠ³ ΡƒΡ€ΠΎΠ²Π½ΠΈ, состояниС Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ², Π΄Π° просто ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ.
Β 

РазумССтся, Ссли Π² схСмС ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ свСтодиоды ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ, Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΎΠ±Π½ΠΈΠΊ Ρ‚ΡƒΡ‚ Π½Π΅ Π½ΡƒΠΆΠ΅Π½ β€” обойдСмся ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΠΈΡΡ срСдствами β€” ΠΏΠ΅Ρ€Π΅Π½Π°Π·Π½Π°Ρ‡ΠΈΠ² ΠΈΡ… Π½Π° врСмя ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ участка.
Β 

ΠŸΡ€Π°Π²Π΄Π° Π² случаях ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ асинхронных устройств, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… Π½Π° Ρ‡Π΅Ρ‚ΠΊΠΈΡ… Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π²Ρ‹Π΄Π΅Ρ€ΠΆΠΊΠ°Ρ… данная затСя ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΏΡ€ΠΎΠΊΠ°Ρ‚ΠΈΡ‚ΡŒ, Π½ΠΎ для Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹, ΠΎ Π½ΠΈΡ… ΠΏΠΎΠ·ΠΆΠ΅.

R Debug — основныС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСльзя ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ!

Π’ этом руководствС ΠΌΡ‹ собираСмся ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠ½ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ R. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ обсудим основныС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ R ΠΈ Π΅Π³ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° R с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ². ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассмотрим ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ установлСнных ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ошибок ΠΈ восстановлСниС.

Π˜Ρ‚Π°ΠΊ, приступим ΠΊ ΡƒΡ€ΠΎΠΊΡƒ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ R Debug?

ГрамматичСски ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅Π²Π΅Ρ€Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΈΠ·-Π·Π° логичСских ошибок.Π’ случаС возникновСния Ρ‚Π°ΠΊΠΈΡ… ошибок (Ρ‚. Π•. Ошибок) Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈ Π³Π΄Π΅ ΠΎΠ½ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΈΡ… ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° выявлСния ΠΈ исправлСния ошибок называСтся Β« ΠΎΡ‚Π»Π°Π΄ΠΊΠ° Β».

БущСствуСт ряд Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ R, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

  • трассировка ()
  • ΠžΡ‚Π»Π°Π΄ΠΊΠ°

  • ()
  • Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ()
  • слСд ()
  • восстановлСниС ()

ΠœΡ‹ обсудим Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ.ΠŸΠ΅Ρ€Π΅Π΄ этим Π΄Π°Π²Π°ΠΉΡ‚Π΅ взглянСм Π½Π° основныС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π² R.

.

Π‘Π΅ΠΊΡƒΠ½Π΄ΠΎΡ‡ΠΊΡƒ! Π’Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ»ΠΈ — Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π² R Programming

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ R

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹ часто ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ тратят большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‡Π΅ΠΌ Π½Π° Π΅Π΅ написаниС. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ бСсцСнны Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅ Π½Π°Π²Ρ‹ΠΊΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.

1. Π‘ΡƒΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ подтвСрТдСния:

Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ошибками — это процСсс подтвСрТдСния, ΠΎΠ΄Π½ΠΎ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΊΠ°ΠΊ Π²Ρ‹ считаСтС, Π²Π΅Ρ€Π½Ρ‹ Π² ΠΊΠΎΠ΄Π΅, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Π΅Ρ€Π½Ρ‹.2 + 3 * g (z, 2)
w <- 28
if (w + q> 0) u <- 1 else v <- -10

2. НачнитС с ΠΌΠ°Π»ΠΎΠ³ΠΎ

ΠŸΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΠΉΡ‚Π΅ΡΡŒ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… простых тСстов, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π² Π½Π°Ρ‡Π°Π»Π΅ процСсса ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ R. Π Π°Π±ΠΎΡ‚Π° с большими ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‚ΡŒ осознаниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ наш ΠΊΠΎΠ΄ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΡ…, слоТных случаях, Π½ΠΎ Π½Π°Ρ‡Π½Π΅ΠΌ с ΠΌΠ°Π»ΠΎΠ³ΠΎ.

3. ΠžΡ‚Π»Π°Π΄ΠΊΠ° Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΌ

ΠŸΡ€Π°Π²ΠΈΠ»Π° повСдСния свСрху Π²Π½ΠΈΠ·:

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния согласны с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ написан ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ.Наш ΠΊΠΎΠ΄ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ уровня Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ достаточно Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ большая Ρ‡Π°ΡΡ‚ΡŒ Π΅Π³ΠΎ состоит ΠΈΠ· Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. И эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ слишком Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌΠΈ ΠΈ ΠΏΡ€ΠΈ нСобходимости Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π­Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Π½Π° этапС написания, Π° Ρ‚Π°ΠΊΠΆΠ΅ позволяСт Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ врСмя Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ ΠΊΠΎΠ΄.

ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ свСрху Π²Π½ΠΈΠ·. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΌΡ‹ установили статус ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f () , ΠΈ ΠΎΠ½Π° содСрТит эту строку.

НапримСр:

Y <- g (x, 8)

Π’ настоящСС врСмя Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ (g).Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ строку ΠΈ посмотритС, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π»ΠΈ g () ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Если это Ρ‚Π°ΠΊ, Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ просто ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΎΠ³ΠΎ процСсса пошагового выполнСния g (). Если g () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ сСйчас самоС врСмя Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ debug (g).

Π£Π·Π½Π°ΠΉΡ‚Π΅ большС ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Ρ… функциях R

4. Π—Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ ошибок

Если Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ пСрСмСнная x Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ, Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ эту строку:

Stopifnot (x> 0)

Если Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅ Π΅ΡΡ‚ΡŒ ошибка, которая ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ x Ρ€Π°Π²Π½Ρ‹ΠΌ, скаТСм, -3, Π²Ρ‹Π·ΠΎΠ² stopifnot () сразу ΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ этому с сообщСниСм ΠΎΠ± ошибкС Π²Ρ€ΠΎΠ΄Π΅ этого:

Ошибка: x> 0 НЕ ИБВИНА

R Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ обсудим Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π² R:

.

1.трассировка ()

Если наш ΠΊΠΎΠ΄ ΡƒΠΆΠ΅ ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠ΅Π» ΠΊΡ€Π°Ρ…, ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π½Π°Ρ‚ΡŒ, Π³Π΄Π΅ находится строка с Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ traceback (). Π­Ρ‚ΠΎ (ΠΈΠ½ΠΎΠ³Π΄Π°) ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ мСстонахоТдСниС Π² ΠΊΠΎΠ΄Π΅ возникшСй ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Когда функция R Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½Π° экран выводится сообщСниС ΠΎΠ± ошибкС. Π‘Ρ€Π°Π·Ρƒ послС ошибки Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ traceback (), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ошибка. Ѐункция traceback () ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ список Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π²Ρ‹Π·Π²Π°Π½Ρ‹ Π΄ΠΎ возникновСния ошибки. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС.3
}

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°:

Π’Ρ‹Ρ…ΠΎΠ΄:

2. ΠΎΡ‚Π»Π°Π΄ΠΊΠ° ()

Ѐункция debug () Π² R позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ пошагово Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, строка Π·Π° строкой. Π’ любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ΠΎ врСмя ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ просто Π½Π°Π±Ρ€Π°Ρ‚ΡŒ Β«cΒ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° ΠΊΠΎΠ΄Π°. traceback () Π½Π΅ сообщаСт Π½Π°ΠΌ, Π³Π΄Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ошибка Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.2
ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ <- сумма (sqr) ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ } set.seed (100) val <- rnorm (100) вСсСльС (1, val) #Author DataFlair

Π’Ρ‹Ρ…ΠΎΠ΄:

> # Автор DataFlair
> ΠΎΡ‚Π»Π°Π΄ΠΊΠ° (вСсСло)
> вСсСльС (1, val) 

Π’Ρ‹Ρ…ΠΎΠ΄:

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠ΅ Β«ΠžΠ±Π·ΠΎΡ€ [1]>Β», Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ:

  • ΠŸΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ n выполняСтся тСкущая строка ΠΈ пСчатаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ;
  • Набрав Q, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ;
  • Π’Π²ΠΎΠ΄ Β«Π³Π΄Π΅Β» ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Π³Π΄Π΅ Π²Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ Π² стСкС Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ;
  • Набрав ls () , ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ вывСсти список всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² локальной срСдС.

Π’Π²ΠΎΠ΄ ΠΈΠΌΠ΅Π½ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ (<имя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°>) сообщаСт Π½Π°ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Если ваш ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠΌΠ΅Π΅Ρ‚ имя n, c ΠΈΠ»ΠΈ Q, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ print () , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈΡ… значСния.

Π—Π½Π°Π΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ ΠΎΠ± ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π² R

3. Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ()

Ѐункция ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ R browser () останавливаСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ Π΅Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Ссли ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ пошаговоС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ всСго ΠΊΠΎΠ΄Π° построчно, Π½ΠΎ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ останавливался Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ этапС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ происходит.3
}

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°:

Π’Ρ‹Ρ…ΠΎΠ΄:

4. трассировка ()

Π’Ρ‹Π·ΠΎΠ² trace () для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π±ΠΈΡ‚Ρ‹ ΠΊΠΎΠ΄Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Бинтаксис Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ R trace () Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ странСн для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ debug ().

НапримСр:

 #Author DataFlair
f <-функция (x) {
  Π³ <-x-g (Ρ…)
  Ρ€
}
g <-функция (y) {
  Π³ <-Ρƒ * Ρ‡ (Ρƒ)
  Ρ€
}
h <-функция (z) {
  Π³ <-log (Π³)
  Ссли (r <10)
    Π³ ^ 2
  Π΅Ρ‰Π΅
    Π³ ^ 3
}
 

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°:

Π’ консоли Π½Π°Π±ΠΈΡ€Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

> ΠΊΠ°ΠΊ.список (Ρ‚Π΅Π»ΠΎ (h))
> trace ("h", Ρ†ΠΈΡ‚Π°Ρ‚Π° (if (is.nan (r)) {browser ()}), at = 3, print = FALSE)
> f (1)
> f (-1)
ΠžΠ±Π·ΠΎΡ€ [1]> n
ΠžΠ±Π·ΠΎΡ€ [2]> ls ()
ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰Π΅Π΅ сообщСниС:
Π’ ΠΆΡƒΡ€Π½Π°Π»Π΅ (z): ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΎ NaN
ΠžΠ±Π·ΠΎΡ€ [2]> r
ΠžΠ±Π·ΠΎΡ€ [2]> z
ΠžΠ±Π·ΠΎΡ€ [2]> trace ("h", Ρ†ΠΈΡ‚Π°Ρ‚Π° (if (z <0) {z <-1}), at = 2, print = FALSE)
ΠžΠ±Π·ΠΎΡ€ [2]> f (-1) 

Π’Ρ‹Ρ…ΠΎΠ΄:

5. Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ()

Когда ΠΌΡ‹ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, recovery () позволяСт Π½Π°ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² функциях Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня.

Набрав число Π² Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅, ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² стСкС Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈ помСщаСмся Π² срСду Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°.

  • ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ recovery () ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ошибок, установлСнный с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ†ΠΈΠΉ () (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠΏΡ†ΠΈΠΉ (error = recovery)).
  • Когда функция Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ останавливаСтся Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ сбоя. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ срСду, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ источник ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

ΠŸΡ€ΠΈ восстановлСнии ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f (), g () ΠΈ h () для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.

> trace ("h", Ρ†ΠΈΡ‚Π°Ρ‚Π° (if (is.nan (r)) {Recovery ()}), at = 3, print = FALSE)
> f (-1)

Π’Ρ‹Π±ΠΎΡ€: 1
ΠžΠ±Π·ΠΎΡ€ [1]> n

Π’Ρ‹Π±ΠΎΡ€: n
Π’Ρ‹Π±ΠΎΡ€: 2
ΠžΠ±Π·ΠΎΡ€ [3]> n

Π’Ρ‹Π±ΠΎΡ€: n
Π’Ρ‹Π±ΠΎΡ€: 3
ΠžΠ±Π·ΠΎΡ€ [5]> n

Π’Ρ‹Π±ΠΎΡ€: n
Π’Ρ‹Π±ΠΎΡ€: 0
ΠžΠ±Π·ΠΎΡ€ [4]> 

Π’Ρ‹Ρ…ΠΎΠ΄:

ΠŸΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ числа Π² Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² стСкС Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈ помСщаСмся Π² срСду Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°.

ПолноС руководство ΠΏΠΎ рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ R

ΠžΡ‚Π»Π°Π΄ΠΊΠ° установлСнных ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π² R

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ошибка, связанная с установлСнным ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ R. Π’ΠΎΡ‚ нСсколько способов Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ:

  • Настройка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (ошибка = восстановлСниС), Π° Π·Π°Ρ‚Π΅ΠΌ построчноС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ n.
  • ΠŸΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ слоТных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€ΠΈ сСбС копию ΠΊΠΎΠ΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² консоли R Π±ΡƒΠ΄Π΅Ρ‚ распСчатан ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² тСкстовый Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€.Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π² Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ.
  • Если ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ всС Π΅Ρ‰Π΅ Π½Π΅ Ρ€Π΅ΡˆΠ΅Π½Ρ‹, Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ исходный ΠΊΠΎΠ΄. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ devtools ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ install (), load_all () , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ процСсс.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок ΠΈ восстановлСниС Π² R

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ ошибок - это процСсс рСагирования Π½Π° Π°Π½ΠΎΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ события Π² ΠΊΠΎΠ΄Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Ρ€ΡƒΡˆΠ°ΡŽΡ‚ Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, ΠΎΠ±Π»Π°ΡΡ‚ΡŒ дСйствия ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ начинаСтся с ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΠΈ заканчиваСтся ΡƒΠ»ΠΎΠ²ΠΊΠΎΠΉ.R прСдоставляСт для этого ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ try () ΠΈ trycatch () .

Ѐункция try () являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ-ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ для trycatch (), которая ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, trycatch () Π΄Π°Π΅Ρ‚ Π²Π°ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ошибки, Π° Ρ‚Π°ΠΊΠΆΠ΅, Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ процСсс Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

 #Author DataFlair
f <- функция (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅) {
  if (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ == 0) {
    stop (Β«Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ 0Β»)
  } else {
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅)
  
}

 

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°:

> inp <- sapply (0: 3, функция (i) f (i))
> Inp <- sapply (0: 3, функция (i) try (f (i)))
> Inp <- sapply (0: 3, функция (i) tryCatch (f (i), error = function (e) NA)) 

Π’Ρ‹Ρ…ΠΎΠ΄:

Π‘Π²ΠΎΠ΄ΠΊΠ°

Π’ этом руководствС ΠΏΠΎ функциям ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ R ΠΌΡ‹ поняли ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π² R вмСстС с ΠΈΡ… функциями ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ.ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ·ΡƒΡ‡ΠΈΠ»ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ установлСнных ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ошибок ΠΈ восстановлСниС Π² R-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ функциях Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° языкС R

Если Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ вопросы, связанныС с ΠΎΡ‚Π»Π°Π΄ΠΊΠΎΠΉ Π² ​​R, Π½Π΅ ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ с Π½Π°ΠΌΠΈ. НадСюсь, ΠΌΡ‹ ΠΏΠΎΠΌΠΎΠΆΠ΅ΠΌ Π²Π°ΠΌ.

.ΠžΡ‚Π»Π°Π΄ΠΊΠ°

- инструкция ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ browser () R

ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка

  1. Около
  2. ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹

  3. Для ΠΊΠΎΠΌΠ°Π½Π΄
  1. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка
    ΠžΠ±Ρ‰Π΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ вопросы ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹

  2. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка для ΠΊΠΎΠΌΠ°Π½Π΄
    Π“Π΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈ дСлятся частными знаниями с ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ

  3. Вакансии
    ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ связанныС с Π½ΠΈΠΌ тСхничСскиС возмоТности ΠΊΠ°Ρ€ΡŒΠ΅Ρ€Π½ΠΎΠ³ΠΎ роста

  4. Π’Π°Π»Π°Π½Ρ‚
    НанимайтС тСхничСских спСциалистов ΠΈ создавайтС свой Π±Ρ€Π΅Π½Π΄ работодатСля

  5. Π Π΅ΠΊΠ»Π°ΠΌΠ°
    ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³Π°ΠΌ со всСго ΠΌΠΈΡ€Π°

  6. О компании

Загрузка…

  1. ΠΠ²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ
    Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ

  2. Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ сообщСство

.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *