聚會時間公告: 因應COSCUP 2011, Kalug 8月份休會一次

十月 19, 2010

Yuren's Info Area
yurinfore
is about »

tag cloud

» [筆記] gdb C++ 小技巧

以前自己用 gdb 都是拿來 debug C 語言的程式,這次拿來對 C++ 除錯發現有些小地方要注意的。

第一個是 C++ 字串。平常印出 C 語言的字串只需要用 print str_var 就可以了,不過要印出 C++ 的字串則是要用 print str_var.c_str()。

另外一個要注意的是 breakpoint 的設定方式。breakpoint 的設定可以用行號或者是 function name,不過如果在 C++ 除錯時如果有 namespace 必須要打出完整的 name + class + method name。比如說 ibus 的 PYBopomofoEditor.cc 裡面有 BopomofoEditor::processBopomofo method,要設定中斷點就必須打


b PY::BopomofoEditor::processBopomofo(unsigned int, unsigned int, unsigned int)


我想你也會跟我一樣覺得打這串也太長了吧,不過 gdb 支援自動補齊,只要打 PY::Bo 之後按下 Tab 鍵就可以用自動補齊的方式快速的打完整串了。

十月 12, 2010

Yuren's Info Area
yurinfore
is about »

tag cloud

» printf debug 大法?改用 gdb 取代 printf debug 方式

這個東西 jserv 在好久以前的演講就提過,不過今天要用又找了一會才找到,筆記與此。

很多時候在 debug 的時候只是要確定程式跑到那段時,大概有很大的機率會加入 printf 到程式碼裡面來進行這樣的 debug 動作。不過使用 printf 每次都要重新編譯源碼實在是有點麻煩,而使用 gdb print 資訊可以在不更動源碼也不會有每次都因為設定中斷點就停下來的問題。

比如說有以下程式:

switch (m_punct_mode) {
    case MODE_DISABLE:
        {
            g_assert (ch == IBUS_grave);
            ...
            update ();
        }
        break;
    case MODE_INIT:
        {
            m_text.clear ();
            ...
            m_cursor = 0;
        }
    case MODE_NORMAL:
        {
            m_text.insert (m_cursor, ch);
            ...
            update ();
        }
        break;
    default:
        g_assert_not_reached ();
    }

我們想在程式運行時知道到底跑到那個 switch case, 就可以用 gdb 來 print。其中的原理是利用中斷之後執行一小段 gdb 命令來達成。gdb 有個指令叫做 commands 可以在中斷後自動執行一小段 gdb 指令,所以如果我們使用 command 指令再配合 print 以及 continue 就可以做出類似 printf 的除錯功能。比如說第一個中斷點的設定方式則為:

b editor.cc:4
commands
print "MODE_DISABLE"
continue
end

這樣執行時就可以讓 gdb 印出資訊達到 printf 的效果,但卻不用重新編譯源碼。

support:

biggo.com.tw

biggo.sg

A Django site.