c++ - tutorial - por qué gdb no puede encontrar el archivo fuente
gdb windows (1)
La razón más probable es ... ¿Se compiló / vinculó la biblioteca compartida con el soporte de depuración? de lo contrario, no tiene los punteros del código binario en los puntos de origen de la biblioteca, por lo que gdb(1)
no puede seguirlos y no puede mostrar dónde se encuentra en el código fuente. Además, están disponibles las fuentes de la biblioteca (si no, será difícil acceder a la fuente --- sé que esta afirmación es ridícula, pero quién sabe :)) o
Si puede, use la opción -g
recompilar la biblioteca de objetos compartidos y vincularla también con esa opción para conservar la información de depuración en el objeto compartido final.
Gdb(1)
tiene comandos para indicar en qué parte del sistema de archivos se encuentra la información del módulo, pero si no tiene los punteros en el binario para localizar los puntos del código fuente, no puede acceder a él.
Supongamos que tiene un programa compuesto por dos archivos: ac
y bc
ac
tiene la función main()
y va a ser un módulo de aplicación normal. bc
va a ser una biblioteca compartida.
Para compilar su aplicación compila AC normalmente (con generación de información de depuración):
cc -g -c a.c -o a.o
Para compilar bc
como un objeto compartido, usa:
cc -fPIC -g -c b.c -o b.so
pero este no es nuestro objeto compartido cargable final. Solo lo hemos compilado en un archivo de objeto (perdón por el sufijo en conflicto) Ahora construya el objeto compartido:
cc -g -o libb.so.1.1 -shared -Wl,-soname=b.so.1 b.so
ver cómo he incluido la opción -g
en compilar bc
y vincular b.so
en libb.so.1.1
.
Ahora, vincula el programa con la siguiente línea de comando:
cc -o a.out -g a.o libb.so.1.1
y a.out
tendrá la información de depuración recibida de ao
y b.so.1.1
(pero debe tenerla en b.so.1.1
si desea poder usarla)
Nota
No sé en este momento si la información de depuración de b.so.1.1
está incluida en a.out
en la fase de enlace de a.out
o debe recopilarse desde libb.so.1.1
en tiempo de ejecución cuando gdb(1)
accede a la biblioteca compartida. Lo más probable es que tenga que estar presente en la biblioteca, ya que son datos que pertenecen a la biblioteca (después de la construcción del programa puedes alimentar tu programa con una implementación diferente del objeto compartido y la información de depuración variará)
libsuperdmgr.so
una lib dinámica llamada libsuperdmgr.so
. Cuando depuro esta lib utilizando gdb, no se puede vincular al archivo de origen. Como el siguiente: en los cuadros 3 y 4 puede mostrar la línea detallada del archivo fuente, pero cuando se trata de mi lib en el cuadro 2 y el cuadro 1, no muestra el número de línea detallado.
#0 std::operator<< <char, std::char_traits<char>, std::allocator<char> > (__os=..., __str=...)
at /root/gcc/gcc-4.5.1/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/basic_string.h:2605
#1 0x00007fffc9ba67db in DmgrWrapper::AddDataStorage(NIODataStorage*, int) () from /home/shawu/infra/wqsim/arch/x86_64_Linux/wqsim_shawu/infra/libsuperdmgr.so
#2 0x00007fffc9ba6eb0 in NIODataStorageTester::Initialize(int, char const*, WQSim_Config::Element const*) ()
from /home/shawu/infra/wqsim/arch/x86_64_Linux/wqsim_shawu/infra/libsuperdmgr.so
#3 0x00007ffff543f527 in WQSim_DataRegistry::Handle (this=<value optimized out>, handle=<value optimized out>, cfg=<value optimized out>)
at wqsim/framework/WQSim_dataregistry.cc:618
#4 0x00007ffff588eea1 in WQSim_ModuleHandler::LoadModules (this=<value optimized out>) at wqsim/framework/WQSim_modulehandler.cc:125
#5 0x00007ffff7593586 in wqsim_main_init (argc=<value optimized out>, argv=<value optimized out>) at wqsim/modules/WQSim_main.cc:1016
¿¿¿Por qué es esto??? ¿Perdí algo en compilación?