2016-10-21 5 views
0

Я хочу протестировать в своей программе ниже: когда s = "abc", прорвется внутри "f()" и увидите значение if "i".STL-тип/функция, используемая в условном прерывании gdb, приведет к сбою программы?

#include<string> 
using namespace std; 
int i=0; 
void f(const string& s1) 
{ 
    ++i; // line 6 
} 
int main() 
{ 
    string s="a"; 
    s+="b"; 
    s+="c"; 
    s+="d"; 
    s+="e"; 
    s+="f"; 
    return 0; 
} 

Скомпилируйте и запустите a.out, никаких проблем. Я тогда отлаживать его

g++ 1.cpp -g 
gdb a.out 
... 
(gdb) b main if strcmp(s.c_str(),"abc")==0 
Breakpoint 1 at 0x400979: file 1.cpp, line 9. 
(gdb) r 
Starting program: /home/dev/a.out 

Program received signal SIGSEGV, Segmentation fault. 
__strcmp_sse2_unaligned() at ../sysdeps/x86_64/multiarch/strcmp-sse2-unaligned.S:31 
31 ../sysdeps/x86_64/multiarch/strcmp-sse2-unaligned.S: No such file or directory. 
Error in testing breakpoint condition: 
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 
(__strcmp_sse2_unaligned) will be abandoned. 
When the function is done executing, GDB will silently stop. 

Program received signal SIGSEGV, Segmentation fault. 

Breakpoint 1, __strcmp_sse2_unaligned() at ../sysdeps/x86_64/multiarch/strcmp-sse2-unaligned.S:31 
31 in ../sysdeps/x86_64/multiarch/strcmp-sse2-unaligned.S 

Если изменить объявление в точке излома в:

(gdb) b main:6 if s.compare("abc")==0 
Breakpoint 1 at 0x400979: file 1.cpp, line 9. 

Тогда я получаю еще один вид аварии, кажется:

(gdb) r 
Starting program: /home/dev/a.out 

Program received signal SIGSEGV, Segmentation fault. 
__memcmp_sse4_1() at ../sysdeps/x86_64/multiarch/memcmp-sse4.S:1024 
1024 ../sysdeps/x86_64/multiarch/memcmp-sse4.S: No such file or directory. 
Error in testing breakpoint condition: 
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 
(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::compare(char const*) const) will be abandoned. 
When the function is done executing, GDB will silently stop. 

Program received signal SIGSEGV, Segmentation fault. 

Breakpoint 1, __memcmp_sse4_1() at ../sysdeps/x86_64/multiarch/memcmp-sse4.S:1024 
1024 in ../sysdeps/x86_64/multiarch/memcmp-sse4.S 

Это крушение вызвано БГД , или моя команда? Если у моей команды была проблема с запуском, то почему gdb не просто сообщает об ошибке, а скорее приводит к сбою программы?

Надеюсь получить некоторые объяснения, так как я не получил эту ошибку.

ответ

1

Что происходит здесь в том, что ваша команда:

(gdb) break main:6 

... интерпретируется БГД такой же, как break main. Вы можете увидеть это, введя последнего, а также:

(gdb) b main:6 
Breakpoint 1 at 0x400919: file q.cc, line 10. 
(gdb) b main 
Note: breakpoint 1 also set at pc 0x400919. 
Breakpoint 2 at 0x400919: file q.cc, line 10. 

Теперь, это свойственно, потому что GDB предположительно должен предупредить вас, что задний :6 игнорируется. (Я бы рекомендовал подать ошибку, просив, чтобы это было сделано синтаксической ошибкой.)

Если вы хотите сломать определенную строку в файле, вы должны использовать имя исходного файла. Предположительно, вы написали:

(gdb) break main.cc:6 

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

  • Нет связанных вопросов^_^