2013-11-11 3 views
1

У меня сложный класс, для которого я написал чистый метод печати, более или менее явно для целей отладки. Однако я не могу понять синтаксис, чтобы использовать его для печати, когда я использую gdb. В основном я хочу , чтобы иметь возможность ввести что-то вроде «myObject-> Print()» и запустить его мой метод печати, но вместо этого я получаю следующее сообщение об ошибке:Просмотр методов печати в GDB

Program received signal EXC_BAD_ACCESS, Could not access memory. Reason: KERN_INVALID_ADDRESS at address: 0x00000000000000a1 0x00007fff814c0684 in std::ostream::sentry::sentry() The program being debugged was signaled while in a function called from GDB. GDB remains in the frame where the signal was received. To change this behavior use "set unwindonsignal on" Evaluation of the expression containing the function (wfSamplePath::print_traj(std::ostream&)) will be abandoned.

где «wfSamplePath» мой класс и «print_traj» - мой метод печати (с std :: cout в качестве аргумента по умолчанию). Так что ясно, что что-то не так с тем, как я думаю, что смогу это сделать. Я использую gdb из xcode 3. «myObject» определенно в области видимости, так как я могу получить доступ к некоторым другим его методам.

+0

Пожалуйста, укажите свой код, который генерирует ошибку, а также. – Flimzy

ответ

1

Оценщик выражений в GDB довольно ограничен, особенно с выражениями C++, поэтому старайтесь держать его простым. В частности, не используйте аргументы по умолчанию. Использование cout также, вероятно, плохая идея. Таким образом, встроенные функции.

У меня хорошие результаты с простой функцией-членом, которая возвращает строку. Например, этот код работает, как ожидалось:

#include <sstream> 

struct S 
{ 
    int x, y, z; 
    std::string debug(); 
}; 

std::string S::debug() 
{ 
    std::ostringstream os; 
    os << x << ", " << y << ", " << z; 
    return os.str(); 
} 

int main() 
{ 
    S s; 
    s.x = 1; 
    s.y = 2; 
    s.z = 3; 
    return 0; 
} 

Затем, компилировать и отлаживать с:

$ g++ -O0 -g test.cpp 
$ gdb ./a.out 
.... 
$start 
.... 
19  s.x = 1; 
(gdb) n 
20  s.y = 2; 
(gdb) n 
21  s.z = 3; 
(gdb) n 
22  return 0; 
(gdb) p s.debug() 
$1 = "1, 2, 3" 
Смежные вопросы