2010-01-12 3 views
0

Я использую ++ библиотеки C, которая предоставляет объект, который, для простоты, более или менее, как это:Отладка большой двойной массив

class ExampleSO { 
    public double* narray; 
}; 

У меня есть экземпляр ExampleSO которого narray о 200. Некоторые другие методы ExampleSO::method() делает много арифметических функции с этим массивом и присваивает его к различным элементам массива:

ExampleSO::method() { 
    // a lot of operations 
    narray[50] = narray[1] * narray[2]/narray[40]; 
    // and so on 

Этот код генерируются другой программой, и он использует кучу Определяет для обработки элементов массива, Итак Код выглядит следующим образом:

#define A narray[0] 
#define X narray[1] 
#define Y narray[2] 
// ... 
#define Z narray[40] 
// .... 
#define U narray[50] 
// ... more, until narray[199] 
ExampleSO::method() { 
    // a lot of operations 
    U = X * Y/Z; 
    // and so on 
} 

Моя проблема заключается в том, что в конечном итоге некоторые элементы массива являются NaN, и я пытаюсь отлаживать код, чтобы понять, почему. Я уже выяснил некоторые из них, которые в основном вызваны делениями на ноль, другие - экспоненциацией очень маленькими числами (малыми, как между 0 и +/- 0,1).

С моим небольшим знанием магии gdb мне удалось увидеть элементы массива на display *(this->narray) @ 200, но этот массив очень большой и, следовательно, нечитабельный.

Так что отладка этого фрагмента кода оказалась сложной задачей, потому что #defines спрятать мне позицию элемента, массив слишком велик и потому, что многие элементы становятся NaN, что я теряюсь.

Мой вопрос: какие идеи/предложения у вас есть, чтобы помочь мне отладить этот код? Возможно, полезна условная точка останова, когда первый элемент массива станет NaN? Как я мог сделать это с такой структурой?

Спасибо!

ответ

4
  1. Перепишите его. Структура, которую вы описываете, ужасна после описания.
  2. Напишите сценарий python, чтобы превратить #defines в псевдонимы переменных gdb, чтобы вы могли ссылаться на них символически.
  3. Использование синтаксиса массива в БГД: р narray[12]
  4. Добавьте некоторые вспомогательные функции отладки и вызывать их из отладчика: p printMyFavoriteValues(narray)
  5. Узнайте, как включить сигнализацию пренебрежимо малых. Это отличается от Windows и Mac против Linux.


#ifdef DARWIN 
    _mm_setcsr(_MM_MASK_MASK &~ 
       (_MM_MASK_OVERFLOW|_MM_MASK_INVALID|_MM_MASK_DIV_ZERO)); 
#else 
    feenableexcept(FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID); 
#endif 
+0

Я не могу переписать его, потому что код генерируется программой, а не мной. Генератор кода тоже не мой, но я буду принимать любые предложения о том, как легко управлять большим количеством двойных переменных, которые хранятся в массиве, таком как этот пример. +1 для сигнализации, я начну с этого – YuppieNetworking

+0

Ну, это устранило вариант 1, но не 2, 3 или 4. 5, безусловно, поможет вам, в любом случае. – bmargulies

+0

Нашел мою ошибку. Спасибо за ваши идеи. 5 был самым полезным, реализованным в любом случае в будущем. – YuppieNetworking

1

Что касается определения вы можете запустить файл через препроцессор, а затем компилировать и отлаживать сам препроцессированный файл.

Макросы X, Y, Z будут разрешены таким образом, и вы увидите фактический индекс. Как вызывать сам препроцессор, зависит от вашего компилятора. Для gcc это команда cpp Documentation.

Что касается выяснения, когда назначается NaN, должен быть коммутатор компилятора, который заставит программу вызывать исключение, когда это произойдет.

+0

Нет никакого переключателя компилятора. Это серия библиотечных функций. – bmargulies

+0

Как насчет -fsignaling-nans gcc? Я все равно сделаю это. – YuppieNetworking

+0

Ну, -fsignaling-nans не сработал ... _mm_setcsr/feenableexcept был способ пойти – YuppieNetworking

0

Если вам нужно отлаживать большой объем кода, созданный макросообщениями, и вы не можете реорганизовать удаление макросов, один из них - временно обработать файл, скопировать код, сгенерированный макросами, и вставить его поверх макросы. Затем вы сможете скомпилировать уже предварительно обработанный код и правильно отладить. Когда вы закончите, просто верните код.

Смежные вопросы