我正在调试CPython可执行的GDB尽管禁用了所有变量,但仍无法获取某些变量的值GCC优化:
(gdb) print *co
value has been optimized out
(gdb) frame
#0 _PyEval_EvalFrameDefault (
f=Frame 0x7ffff7f36050, for file <frozen importlib._bootstrap>, line 8, in <module> (),
throwflag=<optimized out>) at Python/ceval.c:1057
1057 switch (opcode) {
(gdb) info locals
stack_pointer = 0x7ffff7f361c8
next_instr = 0x555555aff422
opcode = 100
oparg = 0
fastlocals = 0x7ffff7f361c8
freevars = <optimized out>
retval = 0x0
tstate = <optimized out>
co = <optimized out>
instr_ub = -1
instr_lb = 0
instr_prev = -1
first_instr = <optimized out>
names = <optimized out>
consts = <optimized out>
... <output cropped>
OS:Ubuntu 18.04.2 LTS
CPython版本: 3.8.0a
编译者:Linux 上的 GCC 7.3.0
Debugger:GNU gdb(Ubuntu 8.1-0ubuntu3)8.1.0.20180409-git
首先,我做了通常的编译--with-pydebug option.
./configure --with-pydebug
make -s -j
它应该保留调试器的所有值,但事实并非如此。
我读到,这个问题的原因是编译器优化,所以我决定完全禁用它。
为此,我更改了相关行配置脚本来自:
# Optimization messes up debuggers, so turn it off for
# debug builds.
if "$CC" -v --help 2>/dev/null |grep -- -Og > /dev/null; then
OPT="-g -Og -Wall"
else
OPT="-g -O0 -Wall"
fi
to:
# Optimization messes up debuggers, so turn it off for
# debug builds.
# if "$CC" -v --help 2>/dev/null |grep -- -Og > /dev/null; then
# OPT="-g -Og -Wall"
# else
# OPT="-g -O0 -Wall"
# fi
OPT="-g -O0 -Wall"
由此产生的优化选项Makefile are:
$ grep -- '-O' Makefile
OPT= -g -O0 -Wall
$(MAKE) all CFLAGS="$(CFLAGS) -O0 -pg -fprofile-arcs -ftest-coverage" LIBS="$(LIBS) -lgcov"
$(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
$(PYTHON_FOR_BUILD) -Wi -OO $(DESTDIR)$(LIBDEST)/compileall.py \
$(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
$(PYTHON_FOR_BUILD) -Wi -OO $(DESTDIR)$(LIBDEST)/compileall.py \
而且,没有帮助。
问题:为什么即使禁用编译器优化,“该值已被优化掉”仍然存在,我该如何克服这个问题?
EDIT
(gdb) info sharedlibrary
From To Syms Read Shared Object Library
0x00007ffff7dd5f10 0x00007ffff7df4b20 Yes /lib64/ld-linux-x86-64.so.2
0x00007ffff7bbbbb0 0x00007ffff7bca0f1 Yes /lib/x86_64-linux-gnu/libpthread.so.0
0x00007ffff79b2e50 0x00007ffff79b3bde Yes /lib/x86_64-linux-gnu/libdl.so.2
0x00007ffff77afe70 0x00007ffff77b093a Yes /lib/x86_64-linux-gnu/libutil.so.1
0x00007ffff741ca80 0x00007ffff74db2f5 Yes /lib/x86_64-linux-gnu/libm.so.6
0x00007ffff70412d0 0x00007ffff71b9c3c Yes /lib/x86_64-linux-gnu/libc.so.6