簡體   English   中英

為什么在!= / ==和&& / ||時gdb不能評估函數 結合在一個表達式?

[英]Why can't gdb evaulate functions when !=/== and &&/|| are combined in an expression?

可能是我在描述我的問題時遇到的困難是我無法找到其中任何一個實例的原因。 我正在使用gdb 7.4-2012.04。

似乎至少涉及兩個!= / ==和&& / ||的表達式 對於向量或向量迭代器將無法在gdb中評估,並出現以下錯誤:

無法訪問地址0x0處的內存

這是一個測試用例,然后是我的編譯行和測試:

#include <stdio.h>
#include <iostream>
#include <stdint.h>
#include <vector>

using namespace std;

typedef char GUID[32];

int main(int argc, char **argv){
    vector<int> vec;
    for (int i=0; i<5; i++){
        vec.push_back(i);
    }
    for (vector<int>::iterator vecIter=vec.begin(); vecIter!=vec.end(); vecIter++){
        int i=0;//Just need a line gdb will recognize for a breakpoint.
    }
    cout << vec[0] << endl;//g++ needs to include operator[] in the binary for this to work.
    return 0;
}

這是我執行的測試的片段:

user@comp$ g++ -g -O0 any_test.cpp
user@comp$ gdb a.out
(gdb) b 16
(gdb) r
Breakpoint 1, main (argc=1, argv=0x7fffffffe288) at any_test.cpp:16
16          int i=0;//Just need a line gdb will recognize for a breakpoint.
(gdb) p *vecIter == vec[1] or *vecIter == vec[2]
Cannot access memory at address 0x0

原始有用的聲明不起作用。 讓我們減少一點,找到問題。

(gdb) p vec[1] or *vecIter == vec[2]
Cannot access memory at address 0x0
(gdb) p vec[1] or *vecIter
$1 = true
(gdb) p 1 or *vecIter == vec[2]
Cannot access memory at address 0x0

在'或'之后看起來問題是'=='。 這和其他運營商一樣嗎?

(gdb) p 1 and *vecIter == vec[2]
Cannot access memory at address 0x0
(gdb) p 1 and *vecIter != vec[2]
Cannot access memory at address 0x0

這是一個響亮的回答。 如果我為gdb提取所有功能怎么辦? 只是讓它取消引用並比較一下?

(gdb) p 1 or *vecIter._M_current == vec._M_impl._M_start[1]
$2 = true

好吧,讓我們檢查deref和函數的一些組合,以確保它不僅僅是導致問題的這些類型之一:

(gdb) p 1 or *vecIter._M_current == *vecIter
Cannot access memory at address 0x0
(gdb) p 1 or vec._M_impl._M_start[1] == vec[1]
Cannot access memory at address 0x0

如您所見,問題不是特定於向量或其迭代器。 如果在&& / ||之后插入並且在== /!=的任一側插入任何操作符(函數),則任何一個操作符都會觸發此問題。

編輯:再次忘記一個問題。 我的問題是:為什么我在“p * vecIter == vec [1]或* vecIter == vec [2]”行中得到“無法訪問地址0x0的內存”?

問題出在返回引用的函數中。 這是一個最小的例子:

int& g() { static int i; return i; }
int main() {}

同樣的問題出現了(我使用的是gdb 7.8.1):

(gdb) p 0 || +g()
Cannot access memory at address 0x0

解決方法是將引用轉換為指針並將其間接轉換:

(gdb) p 0 || +*&g()
$1 = true

提起了一個錯誤: https//sourceware.org/bugzilla/show_bug.cgi? id = 17904

評估“* vecIter == vec [1]”的順序首先評估* vecIter,如果為true,則跳過評估vec [1]並且整個語句為真; 如果是假則再評估vec [1]。 這里的根本原因是vecIter指向無法訪問的NULL內存,甚至無法評估* vecIter。 因此gdb打印出“內存訪問”錯誤。

其他相同錯誤的打印語句的原因相同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM