<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    GDB 多線程調試

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    線程有自己的寄存器,運行時堆棧或許還會有私有內存。 
    gdb提供了以下供調試多線程的進程的功能: 
    * 自動通告新線程。 
    * \ "thread THREADNO\ ",一個用來在線程之間切換的命令。 
    * \ "info threads\ ",一個用來查詢現存線程的命令。 
    * \ "thread apply [THREADNO] [ALL] ARGS\ ",一個用來向線程提供命令的命令。 
    * 線程有關的斷點設置。 
    注意:這些特性不是在所有gdb版本都能使用,歸根結底要看操作系統是否支持。 
    如果你的gdb不支持這些命令,會顯示出錯信息: 
        (gdb) info threads 
        (gdb) thread 1 
        Thread ID 1 not known. Use the \ "info threads\ " command to 
        see the IDs of currently known threads. 
    gdb的線程級調試功能允許你觀察你程序運行中所有的線程,但無論什么時候 
    gdb控制,總有一個“當前”線程。調試命令對“當前”進程起作用。 
    一旦gdb發現了你程序中的一個新的線程,它會自動顯示有關此線程的系統信 
    息。比如: 
        [New process 35 thread 27] 
    不過格式和操作系統有關。 
    為了調試的目的,gdb自己設置線程號。 
    `info threads\ " 
    顯示進程中所有的線程的概要信息。gdb按順序顯示: 
    1.線程號(gdb設置) 
    2.目標系統的線程標識。 
    3.此線程的當前堆棧。 
    一前面打\ "*\ "的線程表示是當前線程。 
    例如: 
    (gdb) info threads 
    3 process 35 thread 27 0x34e5 in sigpause () 
    2 process 35 thread 23 0x34e5 in sigpause () 
    * 1 process 35 thread 13 main (argc=1, argv=0x7ffffff8) 
    at threadtest.c:68 
    `thread THREADNO\ " 
    把線程號為THREADNO的線程設為當前線程。命令行參數THREADNO是gdb內定的 
    線程號。你可以用\ "info threads\ "命令來查看gdb內設置的線程號。gdb顯示該線程 
    的系統定義的標識號和線程對應的堆棧。比如: 
    (gdb) thread 2 
    [Switching to process 35 thread 23] 
    0x34e5 in sigpause () 
    \ "Switching后的內容取決于你的操作系統對線程標識的定義。 
    `thread apply [THREADNO] [ALL] ARGS\ " 
    此命令讓你對一個以上的線程發出相同的命令\ "ARGS\ ",[THREADNO]的含義同上。 
    如果你要向你進程中的所有的線程發出命令使用[ALL]選項。 
    無論gdb何時中斷了你的程序(因為一個斷點或是一個信號),它自動選擇信號或 
    斷點發生的線程為當前線程。gdb將用一個格式為\ "[Switching to SYSTAG]\ "的消息 
    來向你報告。

    對于多線程程序,你可以定義你的斷點是否在所有的線程上,或是在某個特定的線程。GDB很容易幫你完成這一工作。 
    break <linespec> thread <threadno> 
    break <linespec> thread <threadno> if ... 
    linespec指定了斷點設置在的源程序的行號。threadno指定了線程的ID,注意,這個ID是GDB分配的,你可以通過“info threads”命令來查看正在運行程序中的線程信息。如果你不指定thread <threadno>則表示你的斷點設在所有線程上面。你還可以為某線程指定斷點條件。如: 
    (gdb) break frik.c:13 thread 28 if bartab > lim 
    當你的程序被GDB停住時,所有的運行線程都會被停住。這方便你你查看運行程序的總體情況。而在你恢復程序運行時,所有的線程也會被恢復運行。那怕是主進程在被單步調試時。

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全