Error de “acceso protegido a la dirección” al llamar a una función miembro durante la depuración usando lldb.
Estoy intentando depurar el ejecutable clang utilizando el depurador LLDB. He construido LLVM y clang desde la fuente utilizando la configuración -DCMAKE_BUILD_TYPE=Debug
. Soy capaz de establecer correctamente puntos de interrupción en el código, pero obtengo un error al intentar llamar a las funciones miembro en los puntos de interrupción.
Por ejemplo, si escribo el siguiente comando en el punto de interrupción, donde FoundDecl
tiene el tipo ‘clang::NamedDecl*’, obtengo el siguiente error:
print FoundDecl->getIdentifier();
error: La ejecución fue interrumpida, la razón: señal SIGSEGV: acceso a la dirección protegida por acceso (dirección de fallo: 0x555555554000). El proceso ha vuelto al estado anterior a la evaluación de la expresión.
Puedo llamar a la misma función en el punto de interrupción usando el depurador gdb.
Por favor, guíame y dime qué está causando este problema y cómo puedo resolverlo. Gracias de antemano.
davy.ai
Depurando un ejecutable clang con LLDB
Problema
El usuario está intentando depurar el ejecutable clang utilizando LLDB. Han construido LLVM y clang desde la fuente utilizando la configuración
-DCMAKE_BUILD_TYPE=Debug
. Mientras establecen puntos de interrupción en el código, pueden acceder a las variables, pero cuando intentan llamar a las funciones miembro en el punto de interrupción, obtener el siguiente error:Pueden llamar a la misma función usando el depurador gdb.
Solución
Este error ocurre cuando un programa intenta acceder a memoria a la que no tiene permiso de acceso. Esto indica una violación de acceso a memoria, lo cual puede ser causado por varios factores, como acceso a un índice fuera de los límites de un arreglo o la referencia a un puntero nulo.
Para resolver este problema, el usuario puede probar los siguientes pasos:
Verificar si los puntos de interrupción están establecidos correctamente.
Verificar si LLDB puede acceder a la tabla de símbolos de la función.
Intentar usar el comando
fr v
para ver si el valor deFoundDecl
es válido.Intentar imprimir
FoundDecl
utilizandoprint FoundDecl
para verificar si es un puntero válido.Verificar si LLDB puede acceder al código fuente de la función.
Si los pasos anteriores no resuelven el problema, intentar reconstruir LLVM y clang desde la fuente con la bandera
-DLLVM_ENABLE_ASSERTIONS=ON
. Esto activará las aserciones en el código de clang y puede ayudar a identificar el problema.Si ninguno de los pasos anteriores funciona, intentar abrir un problema en el repositorio de Github de LLVM para obtener más soporte.
También es importante destacar que diferentes depuradores pueden tener comportamientos diferentes, y que LLDB no es una solución de reemplazo para gdb.