Depurar en Julia: dos formas



captura de pantalla de metal slug 3







2020 es definitivamente un año de rarezas. Mi código a menudo también incluye algunos errores extraños. Y en esta publicación quiero mostrarte varios métodos para depurar código julia.







De ninguna manera soy un profesional en esto y eso es cierto en todo lo que escribo en un blog, así que tenlo en cuenta ... bueno, en realidad algunos de ustedes pagan por hacer mi trabajo, así que técnicamente yo Puedo llamarme bloguero profesional, ¿verdad?







, . , , . , - .







, . , :









, .









, . , , .







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 .







En tal caso, Infiltrator.jl es el camino a seguir, al menos para mí, y hasta ahora el modo compilado de Debugger.jl no está funcionando lo suficientemente bien. También tiene otras desventajas, ya que no sucede todo a la vez, pero creo que a menudo es superior de usar println



, ya que puede imprimir todo lo que es de interés actualmente en un punto de interrupción determinado y ver todas las variables locales de una sola vez.







¡Gracias por leer y un agradecimiento especial a mis 10 clientes!







Los mantendré actualizados en Twitter OpenSourcES .








All Articles