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

  免費注冊 查看新帖 |

Chinaunix

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

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

論壇徽章:
1
2015年亞洲杯之巴林
日期:2015-02-05 20:34:47
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-01-30 21:58 |只看該作者 |倒序瀏覽
請教大家一個關于內(nèi)存地址突變的一個問題,是這樣的:
我有一個類一個方法是檢測條件狀態(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. }
復制代碼
這個方法運行在多線程環(huán)境中,而且這個方法也是create出來的一個線程執(zhí)行的(大家請忽略語法之類的錯誤)
  1. pthread_create(pid_t, NULL, test::checkstatus, NULL);
復制代碼
問題是:
test這個對象是在堆上new出來的, 、在運行的過程中checkstatus,need_process 這兩個函數(shù)里面打印出來的this指針地址是一致的。

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


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

這個大概可能是什么情況呢?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 [報告]
發(fā)表于 2013-01-30 22:44 |只看該作者
valgrind --tool=memcheck --log-file=xxx --leak-check=full ./your_program

關注xxx里的overlap, invalide 關鍵字。

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

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

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


   

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


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

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

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

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

如果是這樣的話,連續(xù)執(zhí)行的2個指令,第一條的時候 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 [報告]
發(fā)表于 2013-01-31 09:21 |只看該作者
建議你再看一下二樓的回復,你要確定明白二樓想讓你怎么去調(diào)試。

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

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

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


    關鍵是我在嵌入式系統(tǒng)上運行的程序,能用那個工具嗎?整個系統(tǒng)RAM估計只有幾十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 [報告]
發(fā)表于 2013-01-31 10:02 |只看該作者
回復 7# sublx

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


   

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

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


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

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


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

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP