Номер строки источника в обратном следе GDB практически не соответствует

Я скомпилировал все исходные файлы, используя GCC с параметрами -O0 -g3и затем я запустил соответствующий двоичный файл в GDB. После получения SIGABRT я выполнил возвратный след.

Вот вывод «сбоя» из прогона в GDB:

terminate called recursively
terminate called recursively
terminate called after throwing an instance of 'std::out_of_range'
what():  vector::_M_range_check
terminate called recursively

Program received signal SIGABRT, Aborted.
[Switching to Thread 0x7ffff5baf700 (LWP 6434)]
0x00007ffff6be9037 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56  ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.

Вот обратная трассировка GDB (которая сразу же последовала за выводом, показанным выше):

(gdb) bt
#0  0x00007ffff6be9037 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1  0x00007ffff6bec698 in __GI_abort () at abort.c:90
#2  0x00007ffff7921e8d in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007ffff791ff76 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff791f089 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00007ffff791fbc1 in __gxx_personality_v0 () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x00007ffff71a615b in ?? () from /lib/x86_64-linux-gnu/libgcc_s.so.1
#7  0x00007ffff71a65b8 in _Unwind_Resume () from /lib/x86_64-linux-gnu/libgcc_s.so.1
#8  0x0000000000445b5d in simulate4_NEJMdisutilities (P=..., NNSmode=true, NNScontrol=false) at ../simulation4.cpp:1846
#9  0x0000000000420f97 in Policy::evaluate (this=0x8ad368) at ../globals.cpp:686
#10 0x000000000041201b in OCBA_SC(std::vector<Policy, std::allocator<Policy> >&, double, int, int, int, double) [clone ._omp_fn.1] () at ../OCBA.cpp:616
#11 0x00007ffff73b586a in ?? () from /usr/lib/x86_64-linux-gnu/libgomp.so.1
#12 0x00007ffff6f81f8e in start_thread (arg=0x7ffff5baf700) at pthread_create.c:311
#13 0x00007ffff6cabe1d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113
(gdb)

Из кадра № 8 GDB, похоже, заявляет, что проблема возникла из строки 1846 в исходном файле. simulation4.cpp,

Тем не менее, вот строка 1846 (и окружающие линии):

1835    if(NORMAL && VALIDATION) {
1836        P.hist_PSAtest.print();
1837        P.hist_biopsy.print();
1838        P.hist_treatment.print();
1839        P.hist_getCancer.print();
1840        P.hist_getMetastasis.print();
1841        P.hist_death.print();
1842        P.hist_deathOther.print();
1843        P.hist_deathPCa.print();
1844
1845        prevalence.print();
1846    }
1847
1848    /* ------------ TESTING ------------ */
1849    #if SIMULATION4_DEBUG > 1
1850    cout << "After single execution of simulate4_NEJMdisutilities(Policy&,bool,bool):\n";
1851    cout << "  Policy::QALY::sum() = " << P.QALYs.sum() << "\n";
1852    cout << "  Policy::Year::sum() = " << P.Years.sum() << "\n";
1853    cout << "\n";
1854    #endif
1855    /* --------------------------------- */
1856
1857
1858 } //simulate4_NEJMdisutilities()

Чем можно объяснить несоответствие между номерами строк?

В качестве фона, я должен отметить, что я использую std::vector::at() звонит в simulation4.cpp вместо [] оператор, в частности, потому что я подозреваю, что где-то может быть повреждение памяти. До перехода на at() метод, я получил ошибку сегмента.

Я должен также отметить, что VALIDATION=false в моем случае, поэтому ни один из кодов в строках 1836-1845 не выполняется.

3

Решение

У вас есть много макросов в коде? Если у вас много многострочных расширений прекомпилятора (например, многострочных макросов), то ваш «код» изменяется, чтобы включить его в препроцессор, прежде чем произойдет связывание. Они считаются строками кода и поэтому могут сбрасывать ваш отладчик.

1

Другие решения

Других решений пока нет …