编辑:我在 Linux Mint 18.3 (Ubuntu 16.04) X64 上
我在许多其他问题中读到,在 gdb 中执行任意函数的最佳方法是确保正确转换输入/输出变量。
表达式 p ((double(*)())floor)(2.12)
产生 $1 = 2.1200000000000001
和表达式 p ((double(*)())ceil)(2.12)
但是数学库中的其他函数似乎可以工作,例如p ((double(*)())fmod)(12.,5.)
给出 2; p ((double(*)())sqrt)(64.)
给出 8。p ((double(*)())pow)(2.,2.)
按预期给出 4。
所以我的问题是没有给出正确值的 double/ceil 函数有什么区别。由于某种原因,三角函数似乎也没有返回正确的值。它们似乎都具有相同或相似的函数签名,所以我很困惑到底出了什么问题。
math.h c 库是包含的 header ,但代码也链接到 c++ 库 - 不确定这是否会有所不同。
最佳答案
这个:
p ((double(*)())floor)(2.12)
要求 GDB 调用一个不带参数的函数 floor
。
由于在许多平台上(包括 Linux/x86_64
),参数传递 取决于参数的类型(RDI
中的 integer parameters are passed, RSI
等 XMM0
、XMM1
等双参数),你必须告诉GDB是什么类型函数期望的参数(除非存在 libm
调试信息,在这种情况下不需要转换)。尝试
p ((double(*)(double))floor)(2.12)
关于c++ - 在 gdb 中运行 floor() 或 ceil(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52047678/