Debugging di Julia - dua cara



tangkapan layar metal slug 3







2020 jelas merupakan tahun keanehan. Kode saya sering kali menyertakan beberapa bug aneh juga. Dan dalam posting ini saya ingin menunjukkan kepada Anda beberapa metode untuk men-debug kode julia.







Saya sama sekali bukan profesional dalam hal ini dan itu berlaku untuk semua yang saya blog, jadi ingatlah itu ... yah, sebenarnya beberapa dari Anda membayar untuk melakukan pekerjaan saya, jadi secara teknis saya Saya bisa menyebut diri saya seorang blogger profesional, bukan?







, . , , . , - .







, . , :









, .









, . , , .







ProjectEuler problem #21. . .







: 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 .







Dalam kasus seperti itu, Infiltrator.jl adalah cara yang harus ditempuh, setidaknya bagi saya, dan sejauh ini mode yang dikompilasi dari Debugger.jl tidak berfungsi cukup baik. Ini memiliki kelemahan lain juga, karena tidak terjadi sekaligus, tetapi menurut saya ini sering kali lebih baik untuk digunakan println



, karena Anda dapat mencetak semua yang saat ini menarik pada breakpoint tertentu, dan melihat semua variabel lokal sekaligus.







Terima kasih telah membaca dan terima kasih khusus kepada 10 pelanggan saya!







Saya akan terus mengabari Anda di Twitter OpenSourcES .








All Articles