es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for 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:

    error: Execution was interrupted, reason: signal SIGSEGV: address access protected (fault address: 0x555555554000).
    The process has been returned to the state before expression evaluation.
    

    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:

    1. Verificar si las versiones de LLDB y clang son las mismas. Si no lo son, intentar usar las mismas versiones.
    2. Verificar si los puntos de interrupción están establecidos correctamente.

    3. Verificar si LLDB puede acceder a la tabla de símbolos de la función.

    4. Intentar usar el comando fr v para ver si el valor de FoundDecl es válido.

    5. Intentar imprimir FoundDecl utilizando print FoundDecl para verificar si es un puntero válido.

    6. Verificar si LLDB puede acceder al código fuente de la función.

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

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

Comments are closed.