2012-02-29 11 views
7

मैं अपने सी ++ प्रोग्राम डीबग करने के लिए जीडीबी का उपयोग कर रहा हूं। मैं अपने matrices को परिभाषित करने के लिए armadillo संख्यात्मक पुस्तकालय का उपयोग कर रहा हूँ। मैं एक वर्मी मैट्रिक्स इसलिए की तरह परिभाषित किया है:क्या gdb में आर्मडिलो मैट्रिक्स मुद्रित करने का कोई तरीका है?

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

यह पूरे मैट्रिक्स प्रिंट किया जा सकता gdb डीबगर का उपयोग करते समय है?

+0

हालिया जीडीबी (नवीनतम रिलीज जीडीबी 7.4 है) बी ई पायथन में लिखित। क्या आपने इसे माना ?? –

उत्तर

2

आप gdb में सी फ़ंक्शंस को कॉल कर सकते हैं, इसलिए आपको बस अपनी ऑब्जेक्ट प्रिंट करने वाले फ़ंक्शन की आवश्यकता है। E.g:

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

प्रश्न पुराना हो सकता है, लेकिन इस पर ठोकर खाने से मुझे अपने काम के लिए समाधान मिल गया।

कारण वर्मी पुस्तकालय के टेम्पलेट आधारित प्रकृति के आप अपने स्वयं के कुछ सहायकों प्रदान करने की आवश्यकता:

#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; 
} 

अब आप आसानी से print_matrixgdb के भीतर से कॉल कर सकते हैं:

(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 

धन्यवाद टैब पूर्ण करने के लिए आपको केवल print_matrix<arma::Mat<double> > के कुछ वर्णों को टाइप करने की आवश्यकता है।

1

QtCreator का उपयोग करने वालों के लिए, आप extending GDB with Python Debugging Helpers करके अपने आईडीई से मूल्यों का निरीक्षण कर सकते (शायद अन्य IDEs भी इस सुविधा का समर्थन)।

प्लेस में निम्न स्क्रिप्ट, उदाहरण के लिए, ~/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 

और यह आपके ~/.gdbinit को यह पंक्ति जोड़कर फोन:

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

या अपने आईडीई से इसे जोड़ने; QtCreator में टूल्स> विकल्प> डीबगर> जीडीबी (टैब)> अतिरिक्त डिबगिंग हेल्पर्स (नीचे के पास) का उपयोग करें।

यह विशेष रूप से स्क्रिप्ट (मेरी वास्तुकला में प्राकृतिक स्मृति व्यवस्था) मैट्रिक्स स्तंभों के आधार पर व्यवस्थित वापस आ जाएगी:

enter image description here

सूत्रों का कहना है: Writing Debug Visualizers for GDB/QtCreator 2.8

+0

मुझे QtCreator 3.4.0 में काम करने में परेशानी हो रही है। सभी Armadillo matrices मान '<सुलभ नहीं है '' मिलता है। मुझे लगता है कि यह उससे संबंधित हो सकता है कि मेरा जीडीबी पायथन 3 से जुड़ा हुआ है। क्या आपके पास कोई सुझाव है? मैं 'पायथन निष्पादन (खुला (फ़ाइल नाम) .read()) 'का उपयोग कर स्क्रिप्ट जोड़ रहा हूं, जो पाइथन 3 संगत है (' execfile' नहीं है)। –

+0

मुझे अंततः कुछ काम के बाद काम करने के लिए आपकी स्क्रिप्ट मिल गई है। मैंने नवीनतम जीडीबी (7.9.1) को संकलित करने के लिए समाप्त किया, इसे './configure --prefix/usr/local/gdb-python2 --with-python' का उपयोग करके 3 के बजाय पायथन 2 से जोड़कर, और फिर उस जीडीबी का उपयोग करके QtCreator। मुझे आपके 'debugHelpers.py' के शीर्ष पर' आयात gdb' और 'डम्पर आयात *' से भी जोड़ना पड़ा।लेकिन मुझे अभी भी स्क्रिप्ट का एक संस्करण पसंद आएगा जो जीडीबी और पायथन 3 के साथ काम करता है, क्योंकि पाइथन 3 अब डिफ़ॉल्ट है। –

+1

अब मैं इसे पायथन 3 से जुड़े जीडीबी के साथ काम कर रहा हूं। पहले 'आयात जीडीबी' और 'आयात डम्पर' जोड़ें, फिर 'बच्चों()' कॉल को 'डम्पर' बच्चे() 'और 'श्रेणी (0, numDisplayItems) में बदलें। 'से' रेंज (0, int (numDisplayItems)) '। एक पूर्ण लिपि पाई जा सकती है [यहां] (http://pastebin.com/YjbJr4wv) (पेस्टबिन से लिंक)। –

0

सबसे आसान तरीका gdb में सीधे मुद्रित करने के लिए है, दुर्भाग्य से कोई फैंसी प्रारूप

> 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}} 
संबंधित मुद्दे

 संबंधित मुद्दे