2011-06-02 9 views
16

Estoy usando Qt Creator con gdb para depurar mi código C++ en una plataforma Linux. Cada vez que uso un boost::shared_ptr o similar, el depurador ingresa los archivos de encabezado que contienen la implementación de refuerzo (es decir,/usr/include /boost/shared_ptr.hpp). Me gustaría ignorar estos archivos en términos de depuración y simplemente pasar por encima de ellos. Sé que puedo salir tan pronto como llegue a uno de estos archivos, pero sería mucho más fácil depurarlo sin hacerlo varias veces por sesión de depuración. (. gdb que utiliza como depurador)¿Puedo evitar que el depurador ingrese en los archivos de encabezado de STOP o STOP?

estoy usando el compilador gcc (g++), que se ejecuta en Linux openSUSE 11.2 con 2.2 QtCreator

Editar para agregar: La pregunta se orienta hacia archivos Boost, pero podría también se aplica a los archivos STL también.

+1

¿Qué tal esto ?: http://stackoverflow.com/questions/1133365 – 0xC0000022L

+0

@STATUS, gracias. Esa pregunta hace que suene como que no es posible, al menos automáticamente, a menos que exista una diferencia entre el código objeto y el código dinámico de la biblioteca. – Chance

Respuesta

0

En vez de hacer s (paso), se puede
b en la primera línea de su función en la que desea detener (b clase :: método o b file.cpp: Línea),
después c.

GDB pasará por alto el código de impulso y pausa en el punto dado en B, en la que desea que

esto funciona, pero puede parecer tedioso. es una cuestión de habito se vuelve más fácil con la repetición.

msvc comporta similar a BGF

3

gdb es scripts. tiene while, if, variables, subcomandos de shell, funciones definidas por el usuario (define) etc etc. tiene una interfaz de python para la capacidad de escritura.

Con un poco de trabajo, que pueda para que la escritura GDB lo largo de estas líneas:

define step-bypass-boost 
    step 
    while 1 
    use "info source", put current source file into variable 
    if source file does not match */boost/* then 
     break-loop 
    end 
    step 
    end 
end 

o encontrar si alguien ya hizo tales guión

3

BGF sin entrar en STL y todas las demás bibliotecas de/usr:

Ponga lo siguiente en su archivo .gdbinit. Busca a través de las fuentes que gdb ha cargado o potencialmente cargará (comando gdb info sources) y se saltea cuando su ruta absoluta comienza con "/ usr". Está enganchado al comando run, porque los símbolos pueden volver a cargarse al ejecutarlo.

# skip all STL source files 
define skipstl 
python 
# get all sources loadable by gdb 
def GetSources(): 
    sources = [] 
    for line in gdb.execute('info sources',to_string=True).splitlines(): 
     if line.startswith("/"): 
      sources += [source.strip() for source in line.split(",")] 
    return sources 

# skip files of which the (absolute) path begins with 'dir' 
def SkipDir(dir): 
    sources = GetSources() 
    for source in sources: 
     if source.startswith(dir): 
      gdb.execute('skip file %s' % source, to_string=True) 

# apply only for c++ 
if 'c++' in gdb.execute('show language', to_string=True): 
    SkipDir("/usr") 
end 
end 

define hookpost-run 
    skipstl 
end 

Para comprobar la lista de archivos que hay que saltar, establecer un punto de interrupción en alguna parte (por ejemplo, break main) y correr gdb (por ejemplo, run), y después con info sources al llegar al punto de ruptura:

(gdb) info skip 
Num  Type   Enb What 
1  file   y /usr/include/c++/5/bits/unordered_map.h 
2  file   y /usr/include/c++/5/bits/stl_set.h 
3  file   y /usr/include/c++/5/bits/stl_map.h 
4  file   y /usr/include/c++/5/bits/stl_vector.h 
... 

Es fácil extender esto para omitir otros directorios y agregar una llamada al SkipDir(<some/absolute/path>).

+0

Esta solución funciona bien con gcc pero desafortunadamente con icc16. ¡Gracias por esto de todos modos! – shargors