capture d'écran de metal slug 3
2020 est définitivement une année de bizarreries. Mon code contient aussi souvent des bogues étranges. Et dans cet article, je veux vous montrer plusieurs méthodes pour déboguer le code julia.
Je ne suis en aucun cas un professionnel dans ce domaine et c'est vrai pour tout ce sur quoi je blogue, alors gardez cela à l'esprit ... eh bien, en fait, certains d'entre vous paient pour faire mon travail, donc techniquement je Je peux me qualifier de blogueur professionnel, non?
, . , , . , - .
, . , :
, . , , .
: 10 000. …
(a,b)
, d(a) = b
d(b) = a
, d
— , d(4) = 1+2 = 3
.
— a = 220
b = 284
.
, , .
function is_amicable(a, b)
sum_divisors(a) == b && sum_divisors(b) == a
end
. ,return
.
sum_divisors
function sum_divisors(a)
result = 0
for i = 1:a
if a % i == 0
result += i
end
end
return result
end
julia> is_amicable(220, 284) false
, , , , , . .
Debugger.jl REPL
, REPL IDE, VSCode.
, REPL. (Debugger.jl)
julia> ] add Debugger
julia> using Debugger
julia> @enter is_amicable(220, 284)
In is_amicable(a, b) at REPL[7]:1
1 function is_amicable(a, b)
>2 sum_divisors(a) == b && sum_divisors(b) == a
3 end
About to run: (sum_divisors)(220)
1|debug>
@enter is_amicable(220, 284)
, . , , , REPL. , amicable.jl
Revise include
(. REPL and Revise.jl).
, , .
...
julia> using Revise
julia> includet("amicable.jl")
julia> using Debugger
julia> @enter is_amicable(220, 284)
In is_amicable(a, b) at /home/ole/Julia/opensources/blog/2020-10-27-basics-debugging/amicable.jl:1
1 function is_amicable(a, b)
>2 sum_divisors(a) == b && sum_divisors(b) == a
3 end
About to run: (sum_divisors)(220)
1|debug>
. , , sum_divisors(220)
.
1|debug>
, , , .
: Debugger.jl commands
?
enter,
n
— .
1|debug> n
In is_amicable(a, b) at /home/ole/Julia/opensources/blog/2020-10-27-basics-debugging/amicable.jl:1
1 function is_amicable(a, b)
>2 sum_divisors(a) == b && sum_divisors(b) == a
3 end
About to run: return false
sum_divisors(220) != 284
. , , sum_divisors(220)
.
q
,
@enter is_amicable(220, 284)
s
1|debug> s
In sum_divisors(a) at /home/ole/Julia/opensources/blog/2020-10-27-basics-debugging/amicable.jl:5
5 function sum_divisors(a)
> 6 result = 0
7 for i = 1:a
8 if a % i == 0
9 result += i
10 end
About to run: 0
1|debug>
n
, , , , .
, , ?
: , , , , , sum_divisors(220)
. , , , . , .
, , , , .
, , .
, , , , .
bp add
, , . ?
.
bp add 12
. c
, continue ( ).
1|debug> c
Hit breakpoint:
In sum_divisors(a) at /home/ole/Julia/opensources/blog/2020-10-27-basics-debugging/amicable.jl:5
8 if a % i == 0
9 result += i
10 end
11 end
>12 return result
13 end
About to run: return 504
, , 504
284
. `
, . ( , , , , 1|julia>
, julia>
, , ...)
504-284
— , julia, , , :
1|debug> `
1|julia> 504-284
220
, . , .
, :
function sum_divisors(a)
result = 0
#for i = 1:a
for i = 1:a-1
if a % i == 0
result += i
end
end
return result
end
.
, , ,
backspace, q
, .
julia> is_amicable(220, 284) true
, .
. c
1|debug> w add i
1] i: 219
1|debug> w add a
1] i: 219
2] a: 220
. c
, ( sum_divisors(284) == 220
).
w
, :
1|debug> w
1] i: 283
2] a: 284
, , , . .
visual studio julialang.
VSCode
, Julia VSCode IDE , , , vim, emacs - … , , ,
VSCode Atom/Juno, Julia VSCode Atom.
IDE, , , .
, .
, , julia.
is_amicable(220, 284)
, VSCode .
, .
, , .
. . , , , "284". a
i
.
, , , .
. Watch
Variables
, . , , .
: , , ? , .
!
Infiltrator.jl
Julia, - . , , . C++, , , , , , .
, , , , .
, - , Infiltrator.jl. , , , .
100 . , , , , .
Infiltrator.jl . , . @infiltrate
. ,
, . , , REPL. , @infiltrate
, , .
. debugging ConstraintSolver.jl.
using Infiltrator
@infiltrate
.
using Infiltrator
function is_amicable(a, b)
sum_divisors(a) == b && sum_divisors(b) == a
end
function sum_divisors(a)
result = 0
for i = 1:a-1
if a % i == 0
result += i
end
end
@infiltrate
return result
end
is_amicable(220, 284)
include("amicable.jl")
:
Hit `@infiltrate` in sum_divisors(::Int64) at amicable.jl:14: debug>
, , , , sum_divisors
. Debugger.jl .
?
debug> ? Code entered is evaluated in the current function's module. Note that you cannot change local variables. The following commands are special cased: - `@trace`: Print the current stack trace. - `@locals`: Print local variables. - `@stop`: Stop infiltrating at this `@infiltrate` spot. Exit this REPL mode with `Ctrl-D`, and clear the effect of `@stop` with `Infiltrator.clear_stop()`.
, :
debug> @trace [1] sum_divisors(::Int64) at amicable.jl:14 [2] is_amicable(::Int64, ::Int64) at amicable.jl:4 [3] top-level scope at amicable.jl:18 [4] include(::String) at client.jl:457
, is_amicable
, , multiple dispatch.
debug> @locals - result::Int64 = 284 - a::Int64 = 220
, , VSCode.
, . Infiltrator.jl `
, .
debug> a == 220 true
@stop
, , Infiltrator.clear_stop()
, .
@stop
, @infiltrate
CTRL-D
:
Hit `@infiltrate` in sum_divisors(::Int64) at amicable.jl:14: debug>
, , . , , , , @locals
, .
.
Debugger. jl, , REPL.
.
, , VSCode Debugger.jl. , , IDE. Debugger.jl , , .
, , . ( , Debugger.jl). , , , . , , , 1000 .
Dans un tel cas, Infiltrator.jl est la voie à suivre, du moins pour moi, et jusqu'à présent, le mode compilé de Debugger.jl ne fonctionne pas assez bien. Cela présente également d'autres inconvénients, car cela ne se produit pas d'un seul coup, mais je pense que c'est souvent supérieur à utiliser println
, car vous pouvez imprimer tout ce qui est actuellement intéressant à un point d'arrêt donné et voir toutes les variables locales en une seule fois.
Merci d'avoir lu et merci tout spécialement à mes 10 clients!
Je vous tiendrai au courant sur Twitter OpenSourcES .