запустить floor () или ceil () в GDB - PullRequest
0 голосов
/ 28 августа 2018

РЕДАКТИРОВАТЬ: Я на 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 является включаемым заголовком, но код также связан с библиотеками c ++ - не уверен, что это изменит.

1 Ответ

0 голосов
/ 28 августа 2018

Это:

p ((double(*)())floor)(2.12)

просит GDB вызвать функцию floor, которая не имеет аргументов.

Поскольку на многих платформах (включая Linux/x86_64) аргумент передача зависит от типа аргумента ( целочисленные параметры передаются в RDI, RSI и т. Д. двойные параметры в XMM0, XMM1 и т. д.), вы должны сообщить GDB, какой тип функции ожидает функция (если нет libm отладочной информации, и в этом случае преобразование не требуется) ). Попробуйте

p ((double(*)(double))floor)(2.12)
...