亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 9409 | 回復(fù): 21
打印 上一主題 下一主題

[書評] [大件事]gdb調(diào)試技術(shù)以及地址越界相關(guān)!·。 [復(fù)制鏈接]

論壇徽章:
1
2015年亞洲杯之巴林
日期:2015-02-05 20:34:47
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-01-30 21:58 |只看該作者 |倒序?yàn)g覽
請教大家一個(gè)關(guān)于內(nèi)存地址突變的一個(gè)問題,是這樣的:
我有一個(gè)類一個(gè)方法是檢測條件狀態(tài)的。比如這樣:
  1. void test::checkstatus()
  2. {
  3.         while(true)
  4.         {
  5.                 printf("this = %0x\n", this);
  6.                 //其他代碼
  7.                 if (this->need_process())
  8.                 {
  9.                         //process
  10.                 }
  11.                 //其他代碼
  12. }
  13. }

  14. bool test::need_process()
  15. {
  16.         printf("this = %0x\n", this);
  17.         //檢測過程
  18. }
復(fù)制代碼
這個(gè)方法運(yùn)行在多線程環(huán)境中,而且這個(gè)方法也是create出來的一個(gè)線程執(zhí)行的(大家請忽略語法之類的錯(cuò)誤)
  1. pthread_create(pid_t, NULL, test::checkstatus, NULL);
復(fù)制代碼
問題是:
test這個(gè)對象是在堆上new出來的, 、在運(yùn)行的過程中checkstatus,need_process 這兩個(gè)函數(shù)里面打印出來的this指針地址是一致的。

但是有時(shí)候程序在一直在正常得運(yùn)行(這里指兩個(gè)this打印一致,比如都是0x6EA8975),但是某個(gè)時(shí)刻checkstatus打印還是正常的(0x6EA8975),但是掉用need_process的時(shí)候
里面的打印是一個(gè)非法的地址值了,比如是(0x123),以至于need_process函數(shù)里面需要對對象成員進(jìn)行修改導(dǎo)致段錯(cuò)誤。
這時(shí)候,test這個(gè)對象是沒有析構(gòu)的(因?yàn)樵谖鰳?gòu)的最前面有打。。
我gdb進(jìn)去,
1 bt full,發(fā)現(xiàn)有一些值已經(jīng)是一些隨機(jī)值了(比如一個(gè)非常大的整數(shù))。
2 直接print *this,直接提示 0x123這個(gè)地址不能訪問,
3 執(zhí)行up
4 print *this發(fā)現(xiàn)checkstatus這里面還是正常的,所有的變量什么的都是正常值。


我的疑問是,為什么在對象沒有被析構(gòu)的情況下,this指針發(fā)生了跳轉(zhuǎn)(正常情況這兩個(gè)打印this地址的值都是一樣的,而且這個(gè)段錯(cuò)誤不是必現(xiàn)的),
而且他的上一跳 執(zhí)行情況都是正常的 。

這個(gè)大概可能是什么情況呢?gdb之類的我不是很熟,所以想請教一下大家。
非常感謝。

論壇徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46處女座
日期:2013-10-24 14:25:01酉雞
日期:2014-04-07 11:54:15
2 [報(bào)告]
發(fā)表于 2013-01-30 22:44 |只看該作者
valgrind --tool=memcheck --log-file=xxx --leak-check=full ./your_program

關(guān)注xxx里的overlap, invalide 關(guān)鍵字。

另外, 看是否有棧溢出問題, 一般你找不到越界的時(shí)候可能是棧溢出了。

論壇徽章:
1
2015年亞洲杯之巴林
日期:2015-02-05 20:34:47
3 [報(bào)告]
發(fā)表于 2013-01-31 00:03 |只看該作者
回復(fù) 2# linux_c_py_php

我不明白的是,這個(gè)對象是我在堆上申請的,調(diào)用這個(gè)函數(shù)之前什么都是正確的,但是接下來的調(diào)用,this指針已經(jīng)變?yōu)榉欠ǖ牧恕_@個(gè)中間應(yīng)該沒有執(zhí)行任何代碼吧?因?yàn)槲抑苯?/gdb up 之后的 p *this 都是正常的。


   

論壇徽章:
1
2015年亞洲杯之巴林
日期:2015-02-05 20:34:47
4 [報(bào)告]
發(fā)表于 2013-01-31 08:46 |只看該作者
回復(fù) 2# linux_c_py_php


    我的疑問是:比如:
  int *p = new int; //如果這里p的地址是 0xAEF1233(反正是一個(gè)合法的地址)
*p = 100;//這里 段錯(cuò)誤了 p的地址變成了 0x123(不是進(jìn)程空間的地址 )

有什么原因 在我沒有做  delete p 這個(gè)動作  ,而 p的地址發(fā)生了跳變?

或者 ,我1樓的例子中 。我得到了一個(gè)core文件,我的操作步驟為(中間沒有插入任何步驟 ):
1、>bt full (在對象的這個(gè)函數(shù) need_process里  )
2、>print *this;(在對象的這個(gè)函數(shù) need_process里  )
       打印0x123不能訪問。
3、>up
4、>print *this (在對象的這個(gè)函數(shù) checkstatus里  )
    可以打印出 我new出來那個(gè)對象的所有正常的內(nèi)容。

是不是說明 1樓的進(jìn)程執(zhí)行順序是 checkstatus-->調(diào)用 need_process  中間沒有執(zhí)行這個(gè)進(jìn)程其他部分的指令? 就像執(zhí)行順序?yàn)?
int *p = new int; *p = 100;那樣。

如果是這樣的話,連續(xù)執(zhí)行的2個(gè)指令,第一條的時(shí)候 this指針的地址還是合法的,為什么接下來的這一條就變成非法了?
在什么情況下會發(fā)生這樣的事情?
而且,每次this指針變?yōu)榉欠ǖ牡刂范际且荒R荒5?比如都是 :0x123。

論壇徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龍
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
5 [報(bào)告]
發(fā)表于 2013-01-31 09:21 |只看該作者
建議你再看一下二樓的回復(fù),你要確定明白二樓想讓你怎么去調(diào)試。

雖然并不一定是這個(gè)問題,但是,二樓說的是最大的可能。

論壇徽章:
1
2015年亞洲杯之巴林
日期:2015-02-05 20:34:47
6 [報(bào)告]
發(fā)表于 2013-01-31 09:43 來自手機(jī) |只看該作者
那段是編譯選項(xiàng)?不太清楚怎么用。因?yàn)檫@個(gè)問題是偶爾出現(xiàn)的。

論壇徽章:
1
2015年亞洲杯之巴林
日期:2015-02-05 20:34:47
7 [報(bào)告]
發(fā)表于 2013-01-31 09:55 |只看該作者
回復(fù) 5# liuiang


    關(guān)鍵是我在嵌入式系統(tǒng)上運(yùn)行的程序,能用那個(gè)工具嗎?整個(gè)系統(tǒng)RAM估計(jì)只有幾十M。

論壇徽章:
11
未羊
日期:2013-12-16 12:45:4615-16賽季CBA聯(lián)賽之青島
日期:2016-04-11 19:17:4715-16賽季CBA聯(lián)賽之廣夏
日期:2016-04-06 16:34:012015亞冠之卡爾希納薩夫
日期:2015-11-10 10:04:522015亞冠之大阪鋼巴
日期:2015-07-30 18:29:402015亞冠之城南
日期:2015-06-15 17:56:392015亞冠之卡爾希納薩夫
日期:2015-05-15 15:19:272015亞冠之山東魯能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16賽季CBA聯(lián)賽之八一
日期:2016-07-22 09:41:40
8 [報(bào)告]
發(fā)表于 2013-01-31 10:02 |只看該作者
回復(fù) 7# sublx

不管是什么樣的奇技淫巧, 我覺得 pthread_create(pid_t, NULL, test::checkstatus, NULL); 這句將一個(gè)成員函數(shù)作為非成員函數(shù)作為 thread main, 是有點(diǎn)危險(xiǎn)的, 而且, 這個(gè)調(diào)用好歹
pthread_create(pid_t, NULL, test::checkstatus, &test); 才更合理吧, 就算這樣我也奇怪他居然能夠編譯過去不報(bào)錯(cuò)?


   

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
9 [報(bào)告]
發(fā)表于 2013-01-31 10:05 |只看該作者
sublx 發(fā)表于 2013-01-31 00:03
回復(fù) 2# linux_c_py_php

我不明白的是,這個(gè)對象是我在堆上申請的,調(diào)用這個(gè)函數(shù)之前什么都是正確的,但 ...


對象是堆上申請的,對象的成員是個(gè)函數(shù)
你用了pthread_create去創(chuàng)建線程,線程的入口就是這個(gè)函數(shù)指針指向的地址,那么
函數(shù)里的任何自動變量都會用到棧,函數(shù)里的任何靜態(tài)變量都會線程間共享
函數(shù)說白了就是個(gè)地址,存儲這個(gè)地址的指針也許是堆上申請的,但是這個(gè)指針指向的內(nèi)存區(qū)域機(jī)器碼執(zhí)行可就未必是堆上的行為

論壇徽章:
1
2015年亞洲杯之巴林
日期:2015-02-05 20:34:47
10 [報(bào)告]
發(fā)表于 2013-01-31 10:07 |只看該作者
回復(fù) 8# zylthinking


    程序里面不是那樣用的。我只是舉個(gè)例子說明那個(gè)函數(shù)是在一個(gè)單獨(dú)的線程里面運(yùn)行,
實(shí)際上是用 boost::thread 創(chuàng)建的線程 。我在powerpc上運(yùn)行的。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP