金属スラッグ3スクリーンショット
2020年は間違いなく奇妙な年です。私のコードには、奇妙なバグも含まれていることがよくあります。そしてこの投稿では、juliaコードをデバッグするためのいくつかの方法を紹介したいと思います。
私は決してこれの専門家ではありません、そしてそれは私がブログするすべてに当てはまります、それでそれを覚えておいてください...まあ、実際にあなたの何人かは私の仕事をするためにお金を払うので、技術的に私は私は自分をプロのブロガーと呼ぶことができますよね?
, . , , . , - .
, . , :
, . , , .
: 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 .
このような場合、少なくとも私にとってはInfiltrator.jlが最適であり、これまでのところ、Debugger.jlのコンパイル済みモードは十分に機能していません。一度に発生するわけではないので、他の欠点もありprintln
ますが、特定のブレークポイントで現在関心のあるすべてのものを印刷し、すべてのローカル変数を一度に表示できるため、を使用する方が優れていることが多いと思います。
読んでくれてありがとう、そして私の10人の常連客に特に感謝します!
TwitterOpenSourcESで最新情報をお届けします。