سؤال

ولدي 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. الآن أنا جديدة جدا في تطوير البرمجيات في لينكس، لكنني لا أعرف كيف أبدأ بلدي التطبيق في 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. أي مؤشرات على ما يمكن أن تكون هذه المشكلة؟

هل كانت مفيدة؟

المحلول

وهناك المرجح متطابقة مجانا / حذف مكان آخر في التعليمات البرمجية التي يتم تأخير أعراض حتى الآن. عند استخدام ذاكرة محررة، ونظام التشغيل هو حر في مواصلة ما دام يراه مناسبا.

وحاول تشغيل البرنامج في valgrind. يستخدم valgrind لها malloc الخاصة والمجانية، وهكذا يمكن أن نلفت انتباهك إلى أخبار غير صحيحة والحذف. تأكد من ترجمة دون تحقيق أمثلية و مع -g <سوب> 1 :

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

تأكد من لك لا إنشاء المؤشر من متغير كومة أن يخرج من نطاق. على سبيل المثال، وهذا هو الخطأ الشائع بين المطورين أحدث:

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

وكما ذهب خارج النطاق الذي يتم إرجاع مؤشر إلى ذاكرة محررة.


<سوب> 1 معلومات عن -g، من manpage: <م> إنتاج تصحيح المعلومات في شكل نظام التشغيل الأصلي (طعنات، COFF، XCOFF، أو DWARF 2). GDB يمكن أن تعمل مع هذه المعلومات التصحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top