青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 297,  comments - 15,  trackbacks - 0

GDB多線程調(diào)試的基本命令。

info threads
顯示當(dāng)前可調(diào)試的所有線程,每個(gè)線程會(huì)有一個(gè)GDB為其分配的ID,后面操作線程的時(shí)候會(huì)用到這個(gè)ID。
前面有*的是當(dāng)前調(diào)試的線程。

thread ID
切換當(dāng)前調(diào)試的線程為指定ID的線程。

break thread_test.c:123 thread all
在所有線程中相應(yīng)的行上設(shè)置斷點(diǎn)

thread apply ID1 ID2 command
讓一個(gè)或者多個(gè)線程執(zhí)行GDB命令command。

thread apply all command
讓所有被調(diào)試線程執(zhí)行GDB命令command。

set scheduler-locking off|on|step
估計(jì)是實(shí)際使用過(guò)多線程調(diào)試的人都可以發(fā)現(xiàn),在使用step或者continue命令調(diào)試當(dāng)前被調(diào)試線程的時(shí)候,其他線程也是同時(shí)執(zhí)行的,怎么只讓被調(diào)試程序執(zhí)行呢?通過(guò)這個(gè)命令就可以實(shí)現(xiàn)這個(gè)需求。
off 不鎖定任何線程,也就是所有線程都執(zhí)行,這是默認(rèn)值。
on 只有當(dāng)前被調(diào)試程序會(huì)執(zhí)行。
step 在單步的時(shí)候,除了next過(guò)一個(gè)函數(shù)的情況(熟悉情況的人可能知道,這其實(shí)是一個(gè)設(shè)置斷點(diǎn)然后continue的行為)以外,只有當(dāng)前線程會(huì)執(zhí)行。

在介紹完基本的多線程調(diào)試命令后,大概介紹一下GDB多線程調(diào)試的實(shí)現(xiàn)思路。

比較主要的代碼是thread.c,前面介紹的幾個(gè)命令等都是在其中實(shí)現(xiàn)。
thread_list這個(gè)表存儲(chǔ)了當(dāng)前可調(diào)試的所有線程的信息。
函數(shù)add_thread_silent或者add_thread(不同版本GDB不同)用來(lái)向thread_list列表增加一個(gè)線程的信息。
函數(shù)delete_thread用來(lái)向thread_list列表刪除一個(gè)線程的信息。
上面提到的這2個(gè)函數(shù)會(huì)被有線程支持的target調(diào)用,用來(lái)增加和刪除線程,不同的OS對(duì)線程的實(shí)現(xiàn)差異很大,這么實(shí)現(xiàn)比較好的保證了GDB多線程調(diào)試支持的擴(kuò)展性。
函數(shù)info_threads_command是被命令info threads調(diào)用的,就是顯示thread_list列表的信息。
函數(shù)thread_command是被命令thread調(diào)用,切換當(dāng)前線程最終調(diào)用的函數(shù)是switch_to_thread,這個(gè)函數(shù)會(huì)先將當(dāng)前調(diào)試線程變量inferior_ptid,然后對(duì)寄存器和frame緩沖進(jìn)行刷新。
函數(shù)thread_apply_command被命令thread apply調(diào)用,這個(gè)函數(shù)的實(shí)際實(shí)現(xiàn)其實(shí)很簡(jiǎn)單,就是先切換當(dāng)前線為指定線程,然后調(diào)用函數(shù)execute_command調(diào)用指定函數(shù)。

比較特別的是set scheduler-locking沒(méi)有實(shí)現(xiàn)在thread.c中,而是實(shí)現(xiàn)在控制被調(diào)試程序執(zhí)行的文件infrun.c中。
對(duì) 其的設(shè)置會(huì)保存到變量scheduler_mode中,而實(shí)際使用這個(gè)變量的函數(shù)只有用來(lái)令被調(diào)試程序執(zhí)行的函數(shù)resume。在默認(rèn)情況下, 傳遞給target_resume的變量是resume_ptid,默認(rèn)情況下其的值為RESUME_ALL,也就是告訴target程序執(zhí)行的時(shí)候所有 被調(diào)試線程都要被執(zhí)行。而當(dāng)scheduler_mode設(shè)置為只讓當(dāng)前線程執(zhí)行的時(shí)候,resume_ptid將被設(shè)置為inferior_ptid, 這就告訴target只有inferior_ptid的線程會(huì)被執(zhí)行。

最后特別介紹一下Linux下多線程的支持,基本的調(diào)試功能在linux-nat.c中,這里有對(duì)Linux輕量級(jí)別進(jìn)程本地調(diào)試的支持。但是其 在調(diào)試多線程程序的時(shí)候,還需要對(duì)pthread調(diào)試的支持,這個(gè)功能實(shí)現(xiàn)在linux-thread-db.c中。對(duì)pthread的調(diào)試要通過(guò)調(diào)用 libthread_db庫(kù)來(lái)支持。
這里有一個(gè)單獨(dú)的target"multi-thread",這個(gè)target有2點(diǎn)很特別:
第 一,一般target的裝載是在調(diào)用相關(guān)to_open函數(shù)的時(shí)候調(diào)用push_target進(jìn)行裝載。而這個(gè)target則不同,在其初始化 的時(shí)候,就注冊(cè)了函數(shù)thread_db_new_objfile到庫(kù)文件attach事件中。這樣當(dāng)GDB為調(diào)試程序的動(dòng)態(tài)加載庫(kù)時(shí)候attach庫(kù)文 件的時(shí)候,就會(huì)調(diào)用這個(gè)函數(shù)thread_db_new_objfile。這樣當(dāng)GDB裝載libpthread庫(kù)的時(shí)候,最終會(huì)裝載 target"multi-thread"。
第二,這個(gè)target并沒(méi)有像大部分target那樣自己實(shí)現(xiàn)了全部調(diào)試功能,其配合linux-nat.c的代碼的功能,這里有一個(gè)target多層結(jié)構(gòu)的設(shè)計(jì),要介紹的比較多,就不詳細(xì)介紹了。


最后介紹一下我最近遇見(jiàn)的一個(gè)多線程調(diào)試和解決。

基本問(wèn)題是在一個(gè)Linux環(huán)境中,調(diào)試多線程程序不正常,info threads看不到多線程的信息。
我先用命令 maintenance print target-stack看了一下target的裝載情況,發(fā)現(xiàn)target"multi-thread"沒(méi)有被裝載,用GDB對(duì)GDB進(jìn)行調(diào)試,發(fā)現(xiàn)在 函數(shù)check_for_thread_db在調(diào)用libthread_db中的函數(shù)td_ta_new的時(shí)候,返回了TD_NOLIBTHREAD,所 以沒(méi)有裝載target"multi-thread"。
在時(shí)候我就懷疑是不是libpthread有問(wèn)題,于是檢查了一下發(fā)現(xiàn)了問(wèn)題,這個(gè)環(huán) 境中的libpthread是被strip過(guò)的,我想可能 就是以為這個(gè)影響了td_ta_new對(duì)libpthread符號(hào)信息的獲取。當(dāng)我換了一個(gè)沒(méi)有strip過(guò)的libpthread的時(shí)候,問(wèn)題果然解決 了。
最終我的解決辦法是拷貝了一個(gè).debug版本的libpthread到lib目錄中,問(wèn)題解決了。  多線程如果dump,多為段錯(cuò)誤,一般都涉及內(nèi)存非法讀寫。可以這樣處理,使用下面的命令打開(kāi)系統(tǒng)開(kāi)關(guān),讓其可以在死掉的時(shí)候生成core文件。  
ulimit -c unlimited
這樣的話死掉的時(shí)候就可以在當(dāng)前目錄看到core.pid(pid為進(jìn)程號(hào))的文件。接著使用gdb:
gdb ./bin ./core.pid
進(jìn)去后,使用bt查看死掉時(shí)棧的情況,在使用frame命令。

還有就是里面某個(gè)線程停住,也沒(méi)死,這種情況一般就是死鎖或者涉及消息接受的超時(shí)問(wèn)題(聽(tīng)人說(shuō)的,沒(méi)有遇到過(guò))。遇到這種情況,可以使用:
gcore pid (調(diào)試進(jìn)程的pid號(hào))
手動(dòng)生成core文件,在使用pstack(linux下好像不好使)查看堆棧的情況。如果都看不出來(lái),就仔細(xì)查看代碼,看看是不是在if,return,break,continue這種語(yǔ)句操作是忘記解鎖,還有嵌套鎖的問(wèn)題,都需要分析清楚了。


from:

http://blog.chinaunix.net/u3/91335/showart.php?id=2249238

posted on 2010-08-20 17:16 chatler 閱讀(600) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Linux_Coding
<2010年3月>
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺(jué)這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(guān),覺(jué)得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品外国| 欧美精品激情在线| 一本色道久久88精品综合| 可以看av的网站久久看| 亚洲自拍另类| 一区二区欧美国产| 亚洲国产精品一区二区www在线 | 亚洲欧美日韩第一区| 亚洲福利视频在线| 久久久久久电影| 亚洲欧美日本在线| 这里只有视频精品| 亚洲免费成人| 亚洲精品黄色| 亚洲国产福利在线| 一区二区三区在线视频免费观看| 国产精品自在在线| 国产精品久久9| 欧美体内she精视频在线观看| 欧美电影在线| 欧美a级一区| 奶水喷射视频一区| 麻豆视频一区二区| 免费看黄裸体一级大秀欧美| 久久噜噜噜精品国产亚洲综合| 午夜精品久久久久久久久| 亚洲一区二区免费看| 中文一区二区| 亚洲欧美日韩中文在线制服| 亚洲自拍偷拍一区| 香蕉成人久久| 欧美一区二区视频免费观看| 欧美一区二区免费视频| 欧美在线观看视频在线 | 亚洲激情av| 91久久精品日日躁夜夜躁欧美| 亚洲国产精品激情在线观看| 亚洲激情在线视频| 日韩午夜av| 亚洲影院一区| 欧美有码在线观看视频| 久久天堂精品| 欧美激情第3页| 亚洲人久久久| 一区二区三区免费看| 亚洲一区免费网站| av成人动漫| 午夜精品福利在线观看| 久久久精品动漫| 欧美成年人网| 欧美性大战久久久久| 国产精品一区二区你懂的| 国一区二区在线观看| 亚洲国产你懂的| 亚洲天天影视| 久久精品在这里| 欧美高清在线观看| 99pao成人国产永久免费视频| 亚洲在线观看免费| 久久久久久久97| 欧美日韩精品系列| 国产日韩精品一区二区浪潮av| 激情亚洲一区二区三区四区| 亚洲精品日韩久久| 欧美一级大片在线观看| 欧美成人一区二区| 一区二区三区四区国产精品| 久久成人免费电影| 欧美激情二区三区| 国产精品99免费看| 一区二区亚洲精品国产| 一级成人国产| 久久中文精品| 在线亚洲欧美| 久热国产精品视频| 国产精品三区www17con| 亚洲电影自拍| 欧美一级播放| 亚洲精品国产系列| 欧美在线免费| 欧美色图麻豆| 亚洲黄色毛片| 久久久国产午夜精品| 亚洲精品婷婷| 久久亚洲国产精品日日av夜夜| 欧美性猛交一区二区三区精品| 伊人久久av导航| 欧美亚洲视频| 亚洲精品在线视频观看| 久久久亚洲成人| 国产精品亚洲不卡a| 亚洲精品国精品久久99热| 久久狠狠婷婷| 中文av字幕一区| 欧美激情一区二区三区不卡| 国内成人自拍视频| 午夜在线a亚洲v天堂网2018| 亚洲欧洲精品一区| 老司机免费视频一区二区| 国产美女一区| 亚洲一区999| 亚洲精品四区| 欧美成人精品一区| 伊人久久综合97精品| 久久爱另类一区二区小说| 中日韩美女免费视频网站在线观看| 欧美成人69av| 亚洲激情av| 美女露胸一区二区三区| 欧美一区二区高清| 国产精品一区二区久久国产| 中国成人亚色综合网站| 亚洲国内高清视频| 欧美电影资源| 亚洲欧洲综合另类| 欧美高清视频一区| 蜜臀va亚洲va欧美va天堂| 激情久久中文字幕| 久久久综合精品| 久久er精品视频| 国产一区二区三区视频在线观看| 亚洲欧美第一页| 亚洲免费大片| 欧美色网在线| 亚洲一区日本| 亚洲一区二区三区中文字幕在线| 国产精品xvideos88| 亚洲专区一区二区三区| 亚洲色无码播放| 国产精品久久久久久久久免费 | 欧美亚洲免费在线| 国产日韩欧美综合在线| 久久国产88| 久久福利一区| 在线观看日韩专区| 亚洲国产精品视频| 欧美乱妇高清无乱码| 亚洲视频福利| 亚洲欧美日韩在线一区| 国产在线一区二区三区四区| 久久午夜激情| 欧美成人一区二区三区在线观看| 日韩视频中文| 一区二区三区欧美激情| 国产精品一卡二| 麻豆成人综合网| 欧美黄色aa电影| 亚洲亚洲精品三区日韩精品在线视频 | 欧美亚洲综合网| 一区在线播放| 亚洲国产另类久久久精品极度| 欧美人与性动交a欧美精品| 亚洲已满18点击进入久久| 午夜精品视频网站| 亚洲成人在线网站| 亚洲精品国产精品乱码不99按摩| 国产精品久久久久免费a∨大胸 | 国产偷自视频区视频一区二区| 另类图片国产| 欧美日韩国产色站一区二区三区| 亚洲欧美韩国| 久久一区二区三区av| 在线一区二区日韩| 欧美专区在线| aa亚洲婷婷| 欧美资源在线观看| 99re66热这里只有精品4| 亚洲男人第一av网站| 亚洲成色999久久网站| 99国产精品视频免费观看一公开| 国产女主播一区| 亚洲国产第一页| 国产美女高潮久久白浆| 亚洲国产精品久久91精品| 国产精品美女主播| 欧美黄色一级视频| 国产伦精品一区二区三区视频孕妇 | 一区二区三区视频在线播放| 激情成人av| 亚洲素人在线| 最新日韩在线视频| 欧美亚洲综合网| 亚洲视频免费| 久久亚洲午夜电影| 欧美一区二区三区视频在线| 欧美高清在线观看| 久久久爽爽爽美女图片| 欧美日韩在线免费| 欧美成人情趣视频| 国产亚洲日本欧美韩国| 日韩亚洲欧美成人一区| 亚洲国产精品成人综合色在线婷婷| 亚洲一区免费看| 一区二区三区四区五区在线| 久久综合亚州| 久久综合九九| 国产日韩欧美综合在线| 在线视频精品一| 日韩性生活视频| 免费成人美女女|