請參閱如何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