gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:14:05 29 4
gpt4 key购买 nike

请看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 应该打印名为 dictionarystd::vector 全局变量的内容。

这不是我第一次遇到这样的事情。我记得gdb看不到函数、变量等,这次决定记录一下。

最佳答案

当您使用 p ditabtab 时(正如您所做的那样),您可以看到问题 -- gcc 生成的符号称为“dictionary[abi:cxx11]”,您可以通过输入 p 'dicttab 来打印它——注意名称周围的引号让 gdb 不尝试解释[..] 作为表达式。

关于c++ - 为什么 `gdb`看不到全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43575687/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com