2017-04-23 20 views
1

请参阅如何gdb无法打印全局变量dictionary在下面的代码:为什么`gdb`看不到全局变量?

[email protected] ~ $ cat 148.cc 
#include <iostream> 
#include <string> 
#include <vector> 
#include <array> 
#include <utility> 
#include <algorithm> 
#include <sstream> 
using namespace std; 

using letters = array<int, 26>; 
letters emptylet = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
vector<pair<string, letters>> dictionary; 

void backtrace(string &orig, vector<string> &phrase, vector<string> &acc, letters &curr, letters &goal, decltype(dictionary)::iterator it) { 
    if(it == dictionary.end()) 
    return; 
    for(int i = 0; i < it->second.size(); i++) 
    curr[i] += it->second[i]; 
    acc.push_back(it->first); 
    bool all_same = true; 
    for(int i = 0; i < curr.size(); i++) 
    if(curr[i] > goal[i]) 
     goto clean; 
    else if(curr[i] != goal[i]) 
     all_same = false; 
    if(all_same) { 
    if(acc != phrase) { 
     cout << orig << " ="; 
     for(string word: acc) 
     cout << ' ' << word; 
     cout << '\n'; 
    } 
    } else 
    backtrace(orig, phrase, acc, curr, goal, it+1); 
clean: 
    acc.pop_back(); 
    for(int i = 0; i < it->second.size(); i++) 
    curr[i] -= it->second[i]; 
    backtrace(orig, phrase, acc, curr, goal, it+1); 
} 

int main() 
{ 
    while((cin>>ws).peek()!='#') { 
    string word; 
    cin >> word; 
    letters let = emptylet; 
    for(char c: word) 
     let[c-'A']++; 
    dictionary.push_back(make_pair(word, let)); 
    } 
    while((cin>>ws).peek()!='#') { 
    string s; 
    getline(cin, s); 
    string orig = s; 
    stringstream ss(s+'\n'); 
    vector<string> phrase; 
    while(cin>>s){ 
     phrase.push_back(s); 
    } 
    sort(phrase.begin(), phrase.end()); 
    letters let = emptylet; 
    for(string wrd: phrase) 
     for(char c: wrd) 
     let[c-'A']++; 
    vector<string> empt; 
    backtrace(orig, phrase, empt, emptylet, let, dictionary.begin()); 
    } 
} 
[email protected] ~ $ g++ -g -std=c++11 -o 148 148.cc 
[email protected] ~ $ cat 148.in 
ABC 
AND 
DEF 
DXZ 
K 
KX 
LJSRT 
LT 
PT 
PTYYWQ 
Y 
YWJSRQ 
ZD 
ZZXY 
# 
ZZXY ABC DEF 
SXZYTWQP KLJ YRTD 
ZZXY YWJSRQ PTYYWQ ZZXY 
# 
[email protected] ~ $ gdb ./148 
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1 
Copyright (C) 2016 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-linux-gnu". 
Type "show configuration" for configuration details. 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>. 
Find the GDB manual and other documentation resources online at: 
<http://www.gnu.org/software/gdb/documentation/>. 
For help, type "help". 
Type "apropos word" to search for commands related to "word"... 
Reading symbols from ./148...done. 
(gdb) break 52 
Breakpoint 1 at 0x401d0f: file 148.cc, line 52. 
(gdb) r < 148.in 
Starting program: /home/m/148 < 148.in 

Breakpoint 1, main() at 148.cc:52 
52 while((cin>>ws).peek()!='#') { 
(gdb) p dictionary 
No symbol "dictionary" in current context. 
(gdb) p di 
dictionary[abi:cxx11] dir_data     dirfd     dirstream.h    div      divmod_1.c 
difftime     dirent     dirfd.c     disallow_malloc_check div.c     divrem.c 
difftime.c    dirent.h     dirname     distinguish_extX   div_t      
digits_dots.c   dirent64     dirname.c    distinguish_extX.isra.0 divide     
(gdb) p dictionary[abi:cxx11] 
No symbol "dictionary" in current context. 
(gdb) quit 
A debugging session is active. 

    Inferior 1 [process 3815] will be killed. 

Quit anyway? (y or n) y 
[email protected] ~ $ g++ --version 
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 
Copyright (C) 2015 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

[email protected] ~ $ 

我不明白这一点。为什么会这样? gdb有什么明显的我不知道?

据我最好的了解,p dictionary应该打印std::vector全局变量的内容,称为dictionary

而这不是第一次发生在我身上的事情。我记得gdb没有看到函数,变量等。这次我决定记录这个案例。

+0

它可能是'std :: dictionary',因为那个很不明智的'using namespace std;'语句。 –

+0

@HenriMenke有没有像'std :: dictionary'这样的东西?我对这样的事情一无所知,显然cppreference.com [也不知道任何事情](https://www.google.pl/search?q=std::dictionary+site:en.cppreference。 com&gws_rd = cr&ei = iAT9WMfaIYO8swGjyp2YCw#q = std :: dictionary + site:en.cppreference.com&start = 0) – gaazkam

+0

无法重现。尝试启动'-g'到'-g3' – user4581301

回答

1

你可以看到这个问题,当您使用p di标签标签(像你一样) - 由GCC产生的符号被称为“字典[ABI:cxx11]”,你可以通过输入p 'dict打印标签 - 请注意名称周围的引号以使gdb不尝试将[ .. ]解释为表达式。

+1

但是,为什么这个符号称为'dictionary [abi:cxx11]',而不是简单的'dictionary'?通常符号名称没有给出这样的补充 – gaazkam

+0

@gaazkam g ++将pre C++ 11 ABI和post分开,但他们留下了使用其中一个或另一个的能力,因此命名的好处就是结果。 /gcc.gnu.org/onlinedocs/libstdc++/manual/api.html稍微多一些,可能是某个地方更好的答案,如果不是,这可能是一个正式的问题。 – user4581301

相关问题