为什么`gdb`看不到全局变量?

时间:2017-04-23 19:41:39

标签: c++ gdb

请参阅以下代码中gdb无法打印全局变量dictionary的方式:

m@m-X555LJ ~ $ 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());
  }
}
m@m-X555LJ ~ $ g++ -g -std=c++11 -o 148 148.cc
m@m-X555LJ ~ $ 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
#
m@m-X555LJ ~ $ 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
m@m-X555LJ ~ $ 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.

m@m-X555LJ ~ $ 

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

据我所知,p dictionary应打印名为std::vector的{​​{1}}全局变量的内容。

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

1 个答案:

答案 0 :(得分:1)

使用p di 标签 标签时可以看到问题(正如您所做的那样) - gcc生成的符号称为“字典[abi] :cxx11]“,您可以通过输入p 'dict 标签进行打印 - 请注意名称周围的引号,以使gdb无法解释[ .. {{ 1}}作为表达。