2012-02-29 16 views
7

Estoy usando gdb para depurar mi programa C++. Estoy usando la biblioteca numérica de armadillo para definir mis matrices. He una matriz armadillo definido de este modo:¿Hay alguna manera de imprimir una matriz de Armadillo en gdb?

mat A = randu<mat>(5,5); 

¿Es posible imprimir toda la matriz mientras se utiliza el depurador GDB?

+0

gdb reciente (la última versión es GDB 7.4) puede b e guionado en Python. ¿Lo consideraste? –

Respuesta

2

Puede llamar a las funciones C en gdb, por lo que solo necesita una función que imprima sus objetos. E.g:

(gdb) call printf("%.2f", 3.1428) 
$7 = 4 
(gdb) call fflush(stdout) 
3.14$8 = 0 
7

La pregunta puede ser antigua, pero tropezar con ella me hizo encontrar una solución para mi propio trabajo.

Debido a la naturaleza basada en la plantilla de la biblioteca del armadillo es necesario proporcionar algunos ayudantes de su propio:

#include <iostream> 
#include <armadillo> 

template<class Matrix> 
void print_matrix(Matrix matrix) { 
    matrix.print(std::cout); 
} 

//provide explicit instantiations of the template function for 
//every matrix type you use somewhere in your program. 
template void print_matrix<arma::mat>(arma::mat matrix); 
template void print_matrix<arma::cx_mat>(arma::cx_mat matrix); 

int main() { 
    arma::mat matrix = arma::randu(10,10); 

    return 0; 
} 

Ahora se puede llamar fácilmente print_matrix desde dentro gdb:

(gdb) call print_matrix<arma::Mat<double> >(matrix) 
    0.8402 0.4774 0.0163 0.5129 0.5267 0.5260 0.2383 0.5316 0.6879 0.9565 
    0.3944 0.6289 0.2429 0.8391 0.7699 0.0861 0.9706 0.0393 0.1660 0.5886 
    0.7831 0.3648 0.1372 0.6126 0.4002 0.1922 0.9022 0.4376 0.4401 0.6573 
    0.7984 0.5134 0.8042 0.2960 0.8915 0.6632 0.8509 0.9318 0.8801 0.8587 
    0.9116 0.9522 0.1567 0.6376 0.2833 0.8902 0.2667 0.9308 0.8292 0.4396 
    0.1976 0.9162 0.4009 0.5243 0.3525 0.3489 0.5398 0.7210 0.3303 0.9240 
    0.3352 0.6357 0.1298 0.4936 0.8077 0.0642 0.3752 0.2843 0.2290 0.3984 
    0.7682 0.7173 0.1088 0.9728 0.9190 0.0200 0.7602 0.7385 0.8934 0.8148 
    0.2778 0.1416 0.9989 0.2925 0.0698 0.4577 0.5125 0.6400 0.3504 0.6842 
    0.5540 0.6070 0.2183 0.7714 0.9493 0.0631 0.6677 0.3540 0.6867 0.9110 

Gracias Para completar la pestaña solo necesita escribir algunos caracteres de print_matrix<arma::Mat<double> >.

1

Para aquellos que utilizan QtCreator, puede inspeccionar los valores de su IDE por extending GDB with Python Debugging Helpers (tal vez otros entornos de desarrollo compatibles con esta función también).

Coloque la siguiente secuencia de comandos, por ejemplo, ~/debugHelpers.py

#!/usr/bin/python 

import gdb  # gdb.Value() 
import dumper # dumper.Children() 

def qdump__arma__Mat(d, value): 
    array = value["mem"] 
    cols = value["n_cols"] 
    rows = value["n_rows"] 
    maxDisplayItems = 50 
    innerType = d.templateArgument(value.type, 0) 
    p = gdb.Value(array.cast(innerType.pointer())) 
    d.putItemCount(cols) 
    d.putNumChild(cols) 
    if d.isExpanded(): 
     numDisplayItems = min(maxDisplayItems, cols) 
     with dumper.Children(d, numChild=cols, 
       maxNumChild=numDisplayItems, 
       childType="<column>", 
       addrBase=p, 
       addrStep=p.dereference().__sizeof__): 
      for i in range(0, int(numDisplayItems)): 
       with dumper.Children(d): 
        d.putItemCount(rows) 
        d.putNumChild(rows) 
        if d.isExpanded(): 
         numDisplayItems = min(maxDisplayItems, rows) 
         with dumper.Children(d, numChild=rows, 
           maxNumChild=numDisplayItems, 
           childType=innerType, 
           addrBase=p, 
           addrStep=p.dereference().__sizeof__): 
          for j in range(0, int(numDisplayItems)): 
           d.putSubItem(j, p.dereference()) 
           p += 1 

y lo llaman añadir esta línea a su ~/.gdbinit:

python exec(open('/<full_path>/debugHelpers.py').read()) 

o añadirlo en su IDE; en QtCreator usa Herramientas> Opciones> Depurador> GDB (pestaña)> Ayudantes de depuración extra (cerca de la parte inferior).

Este script en particular devolverá la matriz organizada por columnas (disposición de memoria natural en mi arquitectura):

enter image description here

Fuentes: Writing Debug Visualizers for GDB/QtCreator 2.8

+0

Tengo problemas para hacer que esto funcione en QtCreator 3.4.0. Todas las matrices de Armadillo obtienen el valor ''. Creo que podría estar relacionado con que mi gdb está vinculado a Python 3. ¿Tiene alguna sugerencia? Estoy agregando el script usando 'python exec (open (filename) .read())', que es compatible con Python 3 ('execfile' no lo es). –

+0

Finalmente he conseguido que tu script funcione después de un trabajo. Terminé compilando el último gdb (7.9.1), vinculándolo a Python 2 en lugar de 3 usando './configure --prefix/usr/local/gdb-python2 --with-python', y luego usando ese gdb en QtCreator. También tuve que agregar 'import gdb' y' from dumper import * 'a la parte superior de tu' debugHelpers.py'.Pero aún me encantaría una versión del script que funcione con gdb y Python 3, ya que Python 3 parece ser el predeterminado ahora. –

+1

Ahora lo tengo trabajando con gdb vinculado a Python 3. Primero agregue 'import gdb' y' import dumper', luego cambie las llamadas 'Children()' a 'dumper.Children()' and 'range (0, numDisplayItems) 'to' range (0, int (numDisplayItems)) '. Se puede encontrar un script completo [aquí] (http://pastebin.com/YjbJr4wv) (enlace para pegar). –

0

La forma más sencilla es imprimir directamente en gdb, por desgracia sin formato de lujo

> print *[email protected]@5 
$1 = {{0.84018771715470952, 0.39438292681909304,0.78309922375860586,0.79844003347607329, 0.91164735793678431}, 
{0.19755136929338396, 0.33522275571488902, 0.768229594811904, 0.27777471080318777, 0.55396995579543051}, 
{0.47739705186216025, 0.62887092476192441, 0.36478447279184334, 0.51340091019561551, 0.95222972517471283}, 
{0.91619506800370065, 0.63571172795990094, 0.71729692943268308, 0.14160255535580338, 0.60696887625705864}, 
{0.016300571624329581, 0.24288677062973696, 0.13723157678601872, 0.80417675422699042, 0.15667908925408455}} 
Cuestiones relacionadas