문제

나는있다 std::vector<uint8_t> 여기에는 특정 오프셋의 문자열이 포함되어 있습니다. 여기는 단축 덤프입니다.

...
@128    00 00 00 00 00 00 00 00 73 6F 6D 65 74 68 69 33 ........somethin
@144    38 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ng..............
@160    00 00 00 00 00 00 00 00 31 2E 32 2E 33 00 00 00 ........1.2.3...
@176    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
...

나는 오프셋 136에서 데이터를 추출하려고 노력하고 그것을 std::string:

std::string x;
x.assign(vec.begin()+136, vec.begin()+168);

그러나 이것은 내 신청서가 segfault로 유발됩니다. 이제 저는 Linux의 Software Development에서 꽤 새롭지 만 GDB에서 앱을 시작하고 백 트레이스를 얻는 방법을 알고 있으며 여기에서 문제를 추적했습니다.

(gdb) backtrace
#0  0xb7536d78 in ?? () from /lib/i686/cmov/libc.so.6
#1  0xb7538cd5 in malloc () from /lib/i686/cmov/libc.so.6
#2  0xb7708957 in operator new(unsigned int) () from /usr/lib/libstdc++.so.6
#3  0xb76e4146 in std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) () from /usr/lib/libstdc++.so.6
#4  0xb76e63b0 in std::string::_M_mutate(unsigned int, unsigned int, unsigned int) () from /usr/lib/libstdc++.so.6
#5  0xb76e654a in std::string::_M_replace_safe(unsigned int, unsigned int, char const*, unsigned int) () from /usr/lib/libstdc++.so.6
#6  0x0806d651 in std::string::_M_replace_dispatch<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > > > (this=0xbfffe464, __i1=..., __i2=..., __k1=..., __k2=...) at /usr/include/c++/4.3/bits/basic_string.tcc:637
#7  0x0806d26e in std::string::replace<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > > > (this=0x811c730, vec=...) at /usr/include/c++/4.3/bits/basic_string.h:1390
#8  std::string::assign<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > > > (
    this=0x811c730, vec=...) at /usr/include/c++/4.3/bits/basic_string.h:958
#9  myclass::somemethod (this=0x811c730, vec=...) at myclass.cpp:135

인쇄 vec.size() 200을 반환하고 벡터를 통해 반복하고 데이터를 인쇄하면 문제가 발생하지 않습니다 (정확히 충돌하는 스 니펫 위에!).

나는 G ++ 4.3.4로 데비안에서 편집하고 있습니다. 이 문제가 무엇인지에 대한 조언이 있습니까?

도움이 되었습니까?

해결책

코드의 다른 곳에서 불일치 한 무료/삭제가있을 수 있습니다. Freed Memory를 사용하면 운영 체제가 적합하다고 생각되는 한 자유롭게 계속할 수 있습니다.

Valgrind에서 프로그램을 실행해보십시오. Valgrind는 자체 Malloc을 사용하고 무료로 사용하므로 잘못된 뉴스와 삭제를 경고 할 수 있습니다. 확인하십시오 최적화없이 컴파일하십시오 그리고 함께 -g1:

g++ -g main.cc -o binary
valgrind --leak-check=full ./binary

범위를 벗어난 스택 변수에서 포인터를 생성하지 않도록하십시오. 예를 들어, 이것은 새로운 개발자들 사이에서 일반적인 실수입니다.

int *foo() {
    int a = 0;
    // do something to a here
    return &a;
}

A가 범위를 벗어 났을 때, 당신은 무료 메모리에 대한 포인터를 반환합니다.


1에 대한 -g, 인력에서 : 운영 체제의 기본 형식 (Stabs, Coff, Xcoff 또는 Dwarf 2)에서 디버깅 정보를 생성합니다. GDB는이 디버깅 정보로 작동 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top