请参阅如何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
没有看到函数,变量等。这次我决定记录这个案例。
它可能是'std :: dictionary',因为那个很不明智的'using namespace std;'语句。 –
@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
无法重现。尝试启动'-g'到'-g3' – user4581301