スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[GDB][Python][SystemC] GDB+Python拡張で SystemCのデータ型を表示させてみる。

とある某所での情報にて。
(やっぱりセミナーに参加することは良いことだ!)

参考:PythonGdbTutorial

参考:GDBでPython scriptを実行する

なんと! Pythonで色々出来るんですね!!!(・∀・)

ってことで、試してみました。
今回やってみたのは、「5.5. Python Pretty-Printer」です。

※データ型の値を表示するためには、予め SystemCのライブラリは
「Debug」にてコンパイルされていることが必要となります。

  • sc_main.cpp
  •  1|#include <systemc.h>
     2|
     3|int sc_main(int argc, char *argv[]) {
     4|  printf("Hello World!!!\n");
     5|
     6|  int        int_val;
     7|  sc_int<8>  m_int8;
     8|  sc_uint<8> m_uint8;
     9|
    10|  int_val = 255;
    11|  m_int8  = int_val;
    12|  m_uint8 = int_val;
    13|
    14|  std::cout << "int_val = " << int_val << std::endl;
    15|  std::cout << "m_int8  = " << m_int8  << std::endl;
    16|  std::cout << "m_uint8 = " << m_uint8 << std::endl;
    17|  
    18|  return 0;
    19|}

GDB+Python無し

$> gdb main
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/kocha/work/tools/gdb/test/main...done.
(gdb) b 18
Breakpoint 1 at 0x8049612: file sc_main.cpp, line 18.
(gdb) r
Starting program: /home/kocha/work/tools/gdb/test/main 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/i386-linux-gnu/libthread_db.so.1".

             SystemC 2.3.0-ASI --- Nov 26 2013 06:31:13
        Copyright (c) 1996-2012 by all Contributors,
        ALL RIGHTS RESERVED

Hello World!!!
int_val = 255
m_int8  = -1
m_uint8 = 255

Breakpoint 1, sc_main (argc=1, argv=0x8065220) at sc_main.cpp:18
18    return 0;
(gdb) p m_int8
$1 = {<sc_dt::sc_int_base> = {<sc_dt::sc_value_base> = {_vptr.sc_value_base = 0x804a048}, 
    m_val = -1, m_len = 8, m_ulen = 56}, }
(gdb) p m_uint8
$2 = {<sc_dt::sc_uint_base> = {<sc_dt::sc_value_base> = {_vptr.sc_value_base = 0x804a008}, 
    m_val = 255, m_len = 8, m_ulen = 56}, }

っとこんな感じで表示されるのですが、いかんせん見づらいですね。
知っている人は「(gdb) p m_int8.m_val」と入力していたでしょう。

GDB+Pythonあり

(gdb) python execfile("./sc_pretty_printer.py")
(gdb) p m_uint8
$3 = 255
(gdb) p m_int8
$4 = -1
(gdb) 

ちょっとしたコードを書くだけで簡単に、
このようなことが出来てしまいます。

  • sc_pretty_printer.py
  • import re
    import gdb
    
    class SCINTPrinter:
      def __init__(self, val):
        self.val = val
    
      def to_string (self):
        return self.val['m_val']
    
      def display_hint(self):
        return 'string'
    
    def lookup_type (val):
      scint_regex = re.compile("sc_dt::sc_(int|uint)<[0-9]+>")
      if scint_regex.match(str(val.type)) :
        return SCINTPrinter(val)
      return None
    
    gdb.pretty_printers.append (lookup_type)
    

今回、データ型の表示だけですが、もっと色々出来ますので
お楽しみに!

関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。