Metallschnecke 3 Screenshot
2020 ist definitiv ein Jahr der Kuriositäten. Mein Code enthält oft auch einige seltsame Fehler. Und in diesem Beitrag möchte ich Ihnen verschiedene Methoden zum Debuggen von Julia-Code zeigen.
Ich bin kein Profi in diesem Bereich und das gilt für alles, worüber ich blogge. Denken Sie also daran ... nun, tatsächlich zahlen einige von Ihnen für meine Arbeit, also technisch gesehen ich Ich kann mich selbst als professionellen Blogger bezeichnen, oder?
, . , , . , - .
, . , :
, . , , .
: 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 .
In einem solchen Fall ist Infiltrator.jl zumindest für mich der richtige Weg, und der kompilierte Modus von Debugger.jl funktioniert bisher nicht gut genug. Es hat auch andere Nachteile, da es nicht auf einmal passiert, aber ich denke, dass es oft die Verwendung übertrifft println
, da Sie alles drucken können, was aktuell an einem bestimmten Haltepunkt von Interesse ist, und alle lokalen Variablen auf einmal sehen können.
Vielen Dank fürs Lesen und besonderen Dank an meine 10 Gönner!
Ich werde Sie auf Twitter OpenSourcES auf dem Laufenden halten .