gdb - simbolo - punto de interrupcion visual studio 2017
No se puede establecer un punto de interrupción en el principal mientras se depura un programa compilado con Rust 1.10 con GDB (1)
Nota: parece que ya no tengo instalado GDB, solo LLDB, pero para esta pregunta la respuesta es la misma.
El main
que ves en Rust no es el mismo main
que existe en el binario compilado. Específicamente, hay una cantidad de métodos shim entre los dos. El main
Rust en realidad incluye el nombre del cajón (en mi ejemplo buggin
) y un hash (en mi caso hfe08615ed561bb88
):
* frame #0: 0x000000010000126d buggin`buggin::main::hfe08615ed561bb88 + 29 at main.rs:2
frame #1: 0x000000010000810e buggin`std::panicking::try::call::hbbf4746cba890ca7 + 30
frame #2: 0x000000010000aadc buggin`__rust_try + 12
frame #3: 0x000000010000aa76 buggin`__rust_maybe_catch_panic + 38
frame #4: 0x0000000100007f32 buggin`std::rt::lang_start::hbcefdc316c2fbd45 + 562
frame #5: 0x00000001000013aa buggin`main + 42
frame #6: 0x00007fff910435ad libdyld.dylib`start + 1
frame #7: 0x00007fff910435ad libdyld.dylib`start + 1
Aquí, puedes ver que el main
está a unos pocos cuadros de distancia en la pila.
Tiendo a usar un punto de interrupción de comodín para no tratar con el hash:
(lldb) br set -r ''buggin::main.*''
Breakpoint 5: where = buggin`buggin::main::hfe08615ed561bb88 + 29, address = 0x000000010000126d
rbreak
debe ser un equivalente en GDB.
Una vez que se detiene el programa, debería poder ver la fuente. También puede interesarle las rust-lldb
y rust-gdb
que se envían con Rust y mejorar un poco la experiencia.
Esto es básicamente lo mismo que esta respuesta , pero menciona el hash.
Ni
(gdb) rbreak ''rust-gdb-test::main.*''
Ni(lldb) br set -r ''rust-gdb-test::main.*''
Establezco ningún punto de interrupción para mí.
El guión ( -
) no es un carácter de símbolo válido. Cuando se compila, se convierte en un guión bajo.
Mi metodología original fue en realidad esto:
(lldb) br set -r ''.*main.*''
Breakpoint 2: 67 locations.
Luego puede ejecutar el programa y continuar algunas veces hasta que encuentre el lugar correcto. No tengas miedo de entrar y explorar un poco; es solo un depurador!
Puedes probar varias versiones de la expresión regular para ver si algo interesante puede coincidir:
(lldb) br set -r ''.*main::.*''
Breakpoint 3: where = rust-gdb-test`rust_gdb_test::main::h97d2ac6fea75a245 + 29,
(lldb) br set -r ''.*::main.*''
Breakpoint 4: where = rust-gdb-test`rust_gdb_test::main::h97d2ac6fea75a245 + 29,
También podría llamar a una función con un nombre único desde main
y establecer un punto de interrupción en eso:
(lldb) br set -r ''.*a_really_unique_name.*''
Estoy tratando de pasar por esto:
fn main() {
println!("Hello {}", 0);
}
Intenté compilar con ambos: cargo build
y rustc -g -L src/main.rs
Luego ejecuto gdb target/debug/rust-gdb-test
(o gdb main
), y trato de establecer un punto de interrupción en main
con break main
.
( break ::rust-gdb-test::main
returns Function "::rust-gdb-test" not defined.
).
Después de romper ( Breakpoint 1, 0x0000555555559610 in main ()
) si intento ejecutar la list
, obtengo:
1 dl-debug.c: No such file or directory.
Estoy ejecutando Rust 1.10.0 (cfcb716cf 2016-07-03)
y GDB 7.7.1 (Debian 7.7.1+dfsg-5)
.
Una pregunta similar se hizo hace 2 años, pero no pude hacer que las soluciones presentadas allí funcionen.