gdb調試多線程

gdb使用

gdb是非常強大的調試工具,在文本模式下使用。使用方法可以參考陳皓的兩篇文章 
用GDB調試程序(一) 
用GDB調試程序(二)

gdb常用命令在下表列出:

命令 描述
backtrace(或bt) 查看各級函數調用及參數
finish 連續運行到當前函數返回爲止,然後停下來等待命令
frame(或f) 幀編號 選擇棧幀
info(或i) locals 查看當前棧幀局部變量的值
list(或l) 列出源代碼,接着上次的位置往下列,每次列10行
list 行號 列出從第幾行開始的源代碼
list 函數名 列出某個函數的源代碼
next(或n) 執行下一行語句
print(或p) 打印表達式的值,通過表達式可以修改變量的值或者調用函數
quit(或q) 退出gdb調試環境
set var 修改變量的值
start 開始執行程序,停在main函數第一行語句前面等待命令
step(或s) 執行下一行語句,如果有函數調用則進入到函數中

gdb與多線程

在多線程編程時,當我們需要調試時,有時需要控制某些線程停在斷點,有些線程繼續執行。有時需要控制線程的運行順序。有時需要中斷某個線程,切換到其他線程。這些都可以通過gdb實現。

先來看一下gdb調試多線程常用命令:

  • info threads:顯示可以調試的所有線程。gdb會爲每個線程分配一個ID(和tid不同),編號一般從1開始。後面的ID是指這個ID。

  • thread ID:切換當前調試的線程爲指定ID的線程。

  • break FileName.cpp:LinuNum thread all:所有線程都在文件FileName.cpp的第LineNum行有斷點。

  • thread apply ID1 ID2 IDN command:多個線程執行gdb命令command。

  • thread apply all command:所有線程都執行command命令。

  • set scheduler-locking off|on|step:在調式某一個線程時,其他線程是否執行。off,不鎖定任何線程,默認值。on,鎖定其他線程,只有當前線程執行。step,在step(單步)時,只有被調試線程運行。

  • set non-stop on/off:當調式一個線程時,其他線程是否運行。

  • set pagination on/off:在使用backtrace時,在分頁時是否停止。

  • set target-async on/ff:同步和異步。同步,gdb在輸出提示符之前等待程序報告一些線程已經終止的信息。而異步的則是直接返回。

來看一個例子: 
gdbTest.cpp。程序很簡單,只是讓兩個線程執行函數ThreadFun,在函數中打印傳入的參數。

<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <iostream></span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <pthread.h></span>

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>* ThreadFun(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>* arg)
{
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> *value=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static_cast</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>*> (arg);
    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span><<<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"This is thread"</span><<*value<<<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::endl;
    pthread_exit(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);
}

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> main()
{
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>  ret=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
    pthread_t thread_id1,thread_id2;

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>* v1=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>* v2=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>);
    ret = pthread_create(&thread_id1, NULL, ThreadFun, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static_cast</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>*>(v1)); 
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (ret)
    {
        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span><<<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Create pthread error!"</span><<<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::endl;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;
    }

    ret = pthread_create(&thread_id2, NULL, ThreadFun, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static_cast</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>*>(v2));
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (ret)
    {
        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span><<<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Create pthread error!"</span><<<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::endl;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;
    }

    pthread_join(thread_id1, NULL);
    pthread_join(thread_id2, NULL);

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li></ul>
<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">$ gdb gdbThreadTest<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//調試gdbThreadTest</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

加斷點

<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">(gdb) break <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>
Breakpoint <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">at</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x400a19</span>: <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">file</span> kangThread.cpp, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">line</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7.</span>
(gdb) break <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">35</span>
Breakpoint <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">at</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x400b35</span>: <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">file</span> kangThread.cpp, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">line</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">35.</span>
(gdb) info break
Num     Type           Disp Enb Address            What
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>       <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">breakpoint</span>     keep y   <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x0000000000400a19</span> <span class="hljs-operator" style="box-sizing: border-box;">in</span> ThreadFun(void*) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">at</span> kangThread.cpp:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>       <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">breakpoint</span>     keep y   <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x0000000000400b35</span> <span class="hljs-operator" style="box-sizing: border-box;">in</span> main() <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">at</span> kangThread.cpp:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">35</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

開始運行

<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">(gdb) r
Starting program: /home/kang/src/mulThread/kangThread 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Traceback (most recent <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">call</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">last</span>):
  File <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19-gdb.py"</span>, line <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">63</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> <<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">module</span>>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">from</span> libstdcxx.v6.printers import register_libstdcxx_printers
ImportError: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">No</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">module</span> named <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'libstdcxx'</span>
[New Thread <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x7ffff6fd5700</span> (LWP <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2773</span>)]
[Switching <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">to</span> Thread <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x7ffff6fd5700</span> (LWP <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2773</span>)]

Breakpoint <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, ThreadFun (arg=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x602010</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">at</span> kangThread.cpp:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>
warning: Source file <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">is</span> more recent than executable.
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>       <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> *<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>=static_cast<<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>*> (arg);</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

查看線程信息

<code class="hljs mathematica has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">(gdb) info thread
[New <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Thread</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x7ffff67d4700</span> (LWP <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2774</span>)]
  Id   Target Id         <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Frame</span> 
  <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Thread</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x7ffff67d4700</span> (LWP <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2774</span>) <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"kangThread"</span> clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">81</span>
* <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Thread</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x7ffff6fd5700</span> (LWP <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2773</span>) <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"kangThread"</span> ThreadFun (arg=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x602010</span>) at kangThread.cpp:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>
  <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Thread</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x7ffff7fda780</span> (LWP <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2769</span>) <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"kangThread"</span> clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">81</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

可以看到ID爲2的線程執行到了斷點Breakpoint 1。可以看一下value的值

<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">(gdb) n
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>       <span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">std:</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:cout<<<span class="hljs-string" style="box-sizing: border-box;">"This is thread"</span><<*value<<std</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:endl</span>;
(gdb) p *value
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$2</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

切換到線程3,看一下線程3執行到了哪裏

<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">(gdb) c
Continuing.
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>
[Switching to Thread <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x7ffff67d4700</span> (LWP <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2774</span>)]

Breakpoint <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, ThreadFun (arg=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x602030</span>) at kangThread.cpp:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>       <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> *value=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static_cast</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>*> (arg);
(gdb) info thread
  Id   Target Id         Frame 
* <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>    Thread <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x7ffff67d4700</span> (LWP <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2774</span>) <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"kangThread"</span> ThreadFun (arg=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x602030</span>) at kangThread.cpp:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>
  <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>    Thread <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x7ffff6fd5700</span> (LWP <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2773</span>) <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"kangThread"</span> __GI__dl_debug_state () at dl-debug.c:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">74</span>
  <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>    Thread <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x7ffff7fda780</span> (LWP <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2769</span>) <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"kangThread"</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x00007ffff7bc566b</span> in pthread_join (threadid=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">140737337186048</span>, 
    thread_return=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x0</span>) at pthread_join.c:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">92</span>
(gdb) thread <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>
[Switching to thread <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> (Thread <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x7ffff67d4700</span> (LWP <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2774</span>))]
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#0  ThreadFun (arg=0x602030) at kangThread.cpp:7</span>
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>       <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> *value=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static_cast</span><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>*> (arg);
(gdb) n
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>       <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span><<<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"This is thread"</span><<*value<<<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::endl;
(gdb) p *value
$<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li></ul>

可以看出線程3的value爲2。

還有其他許多命令和方法,要在實踐中慢慢熟悉。

0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章