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

2024-03-17

我正在调试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

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法摆脱 GDB 中的“值已被优化掉” 的相关文章

  • 字符串初始化的 gcc 诊断不一致

    我正在使用 gcc 4 9 1 Mingw 并使用以下命令编译代码 gcc test c otest exe std c11 迂腐错误 Wall Wextra 此代码给出诊断 int main void char a 5 h e l l o
  • 使用 libtool 和 gdb

    我正在开发一个使用 GNU 自动工具的项目 因此为了使用 gdb 调试代码 我从 libtool 中运行 gdb libtool mode execute gdbtui foobar 是否可以重新加载项目的修改版本 而不必退出 gdb li
  • Linux 上的 头文件在哪里?为什么我找不到 ? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在Linux中实现C的getch 函数 https stackoverflow com questions 3276546 how to implement getch function of c
  • 在 Solaris 上,使用 gcc 编译的库与使用 cc 生成的库的使用方式是否相同?

    我目前正在尝试编译 libxml2在 Solaris 上 当我运行源代码提供的 configure 脚本时 会自动使用 gcc 和 g 编译器 但是 我想使用 cc 和 CC 编译器 所以我跑 configure CC cc CXX CC
  • 类和结构在填充和继承方面的区别

    以下所有操作都将在 GCC 9 1 上使用编译器资源管理器 https github com mattgodbolt compiler explorer 在 x86 64 中 使用 O3 我有这个代码 struct Base Base do
  • CMake:不要为链接中使用的单个库设置 rpath

    我想要做的是配置我的 CMakeLists 文件 以便在构建我的项目时 链接器使用驻留在我的构建树中的共享库 so 的副本来链接可执行文件 但不会在中设置 rpath链接的可执行文件 以便系统必须在加载程序请求时提供该库 具体来说 我想在构
  • Clang 使用 -nostdlib 生成崩溃代码

    我正在尝试为可执行文件设置自己的运行时环境 但无法使用 clang v3 4 1ubuntu1 目标 x86 64 pc linux gnu 来生成没有段错误的可执行文件 我已将问题简化为以下内容 如果我有一个文件 crt1 c 除了满足
  • 如何为单个函数设置 ICC 属性“fp-model precision”,以防止关联优化?

    我正在实施卡汉求和 http en wikipedia org wiki Kahan summation algorithm 在支持 gcc47 gcc48 clang33 icc13 和 icc14 编译的项目中 作为该算法的一部分 我想
  • 列出 C 常量/宏

    有没有办法使GNU C 预处理器 cpp 或其他一些工具 列出给定点上的所有可用宏及其值C file 我正在寻找特定于系统的宏 同时移植一个已经精通 UNIX 的程序并加载一堆稀疏的 UNIX 系统文件 只是想知道是否有比寻找定义更简单的方
  • C 程序的“编译器正确”命令

    这是关于中提到的编译步骤Linux 期刊文章 https www linuxjournal com article 6463 C 程序是使用编译的cpp cc1 as and ld该文章中的命令 我能够执行这些步骤cpp as and ld
  • 使用 -static-libgcc -static-libstdc++ 编译仍然会导致对 libc.so 的动态依赖

    我正在尝试制作一个尽可能可移植的可执行文件 删除一些依赖项后 我在另一个系统上运行二进制文件时遇到以下问题 lib x86 64 linux gnu libm so 6 version GLIBC 2 15 not found requir
  • gcc总是做这种优化吗? (公共子表达式消除)

    作为示例 假设表达式sys gt pot atoms item gt P kind mass在循环内求值 循环只改变item 因此表达式可以简化为atoms item gt P kind mass通过将变量定义为atoms sys gt p
  • 利用 SSE 和其他 CPU 扩展

    在我的代码库中有几个地方 对于大型数据集 相同的操作会重复很多次 在某些情况下 处理这些需要花费相当长的时间 我相信使用SSE来实现这些循环应该可以显着提高它们的性能 特别是在对同一组数据执行许多操作的情况下 因此一旦数据最初被读入缓存 就
  • typeof() 表达式内的副作用

    在 GNUC C 中 您可以使用typeof expression 并且使用内部带有副作用的表达式是合法的 例如 您可以使用以下 C 代码 int x 0 typeof x y 在这种情况下 副作用被忽略 并且 x 之后仍然为零 这是有道理
  • 在 Ubuntu 上用 C 项目编译和链接 GTK 3

    我相信这不是重复的问题 在发布此问题之前我已经看过所有问题 答案 我想我这里的情况有所不同 我使用Ubuntu 12 04并下载GTK 2 和 3 我从 GNOME 网站复制了一个简单的 GTK 源代码 但是当我在终端中使用这个命令时 gc
  • 为什么 -march=native 很少使用?

    对于大多数 C C 编译器 有一个可传递给编译器的标志 march native 它告诉编译器调整为主机 CPU 的微架构和 ISA 扩展生成的代码 即使它的名称不同 基于 LLVM 的编译器通常也有一个等效的选项 例如rustc or s
  • gdb 错误 - 文件不是可执行格式:无法识别文件格式

    我正在尝试使用 gdb 调试某个名为 xdf 的程序 但是当我运行 gdb xdf 时 出现以下错误 home nealtitusthomas X ray astronomy heasoft 6 24 x86 64 pc linux gnu
  • 公共基类打破了元组的空基类优化

    gcc 4 7 1 对元组进行空基类优化 我认为这是一个非常有用的功能 然而 这似乎有一个意想不到的限制 include
  • GCC:数组类型具有不完整的元素类型

    我已经宣布了struct 我尝试传递这些结构的数组 以及double双精度数组和一个整数 到一个函数中 我得到一个 数组类型具有不完整的元素类型 当我编译它时来自 gcc 的消息 我在通过考试的过程中犯了什么错误struct到函数 type
  • 错误:“uint16_t”未声明? [复制]

    这个问题在这里已经有答案了 我有代码 include

随机推荐