无法摆脱GDB中的“价值已优化”

时间:2019-06-30 12:53:21

标签: gcc gdb cpython

我正在通过 GDB 调试 CPython 可执行文件,尽管禁用了所有 GCC 优化,但无法获取某些变量的值:< / p>

(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>

操作系统::Ubuntu 18.04.2 LTS
CPython版本:3.8.0a
编译:Linux上的GCC 7.3.0
调试器:GNU gdb(Ubuntu 8.1-0ubuntu3)8.1.0.20180409-git

首先,我使用-with-pydebug 选项进行了常规编译。

./configure --with-pydebug
make -s -j

它应该为调试器保留所有值,但不是。

我已经读到,导致此问题的原因是编译器优化,因此我决定完全禁用它。 为此,我从以下位置更改了 configure 脚本中的相关行:

# 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

收件人:

# 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 中生成的优化选项为:

$ 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 \

也没有帮助。

问题:即使禁用了编译器优化,为什么“价值已被优化”仍然存在,我该如何克服这个问题?

编辑

(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

0 个答案:

没有答案