Bir Linux mashinasida segmentatsiya buzilishi, ammo boshqa C ++ kodi bilan emas

Men o'ziga xos muammolarga duch kelganman. Men ishda Linux klasterida C ++ dasturini ishlab chiqdim. Uni Ubuntu 14.04 mashinasida ishlatishga harakat qildim, lekin 6 ta fayldan iborat dastur: main.hpp, main.cpp (qaram bo'lgan) sarsa.hpp, sarsa.cpp (sinf Sarsa) (qaram bo'lgan) wec.hpp, wec.cpp kompilyatsiya qiladi, lekin men uni ishga tushirganimda segment xatosi yoki Sarsa sinfining asosiy funktsiyasini kiritmaydi.

Asosiy kod konstruktor va setter funktsiyalarini muammosiz chaqiradi:

  Sarsa run;
  run.setVectorSize(memory,3,tilings,1000);

va boshqalar.

Biroq, katta kodni o'z ichiga oladigan learningRate dan foydalangan holda epizode umumiy funktsiyasini ishga tushirib bo'lmaydi, barcha qismlar uchun (qaytarish) 0 qaytaradi.

learningRate[episode]=run.episode(numSteps,graph);}

Kodni gdb bilan disk raskadrovka qilishga urindim, u qaytib keldi:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000408f4a in main() at main.cpp:152
152     learningRate[episode]=run.episode(numSteps,graph);}

Shuningdek, valgrind ni qaytadan ishga tushirdim:

==10321==  Uninitialised value was created by a stack allocation
==10321==    at 0x408CAD: main (main.cpp:112)

Lekin xotira miqdori yo'q.

sarsa.cpp tashqi faylini disk raskadrovka qilishga urinish mavjudmi yoki yo'qmi, deb o'ylayman, chunki menimcha, bu sinfning tovushi

Faylda men C ++ v11 tilidan foydalanaman (kompilyatsiya vaqtida xatolarni kutmoqchi bo'ldim), shuning uchun hatto g ++ -std = c ++ 0x bilan ham tuzilgan edim, lekin takomillashtirish.

Shubhasiz, kodning kattaligi tufayli men uni bu erga yozolmayman. Ushbu muammo bilan bog'liq har qanday yordamni juda qadrlayman. Men ochiq-oydin narsa yo'qmi? Menga hech bo'lmasa disk raskadrovka bilan yordam bera olasizmi?

Yordam uchun oldindan rahmat.

Correction: main.cpp:

Global qator ta'rifi: `#Define numEpisodes 10

int learningRate [numEpisodes] ;;

main funktsiyasining oxiriga to'g'ri keladi:

for (int episode; episode

4
1. Segfaural kodi main.cpp dan olingan kodda sodir bo'lgandan beri boshlash uchun yaxshi joy ko'rinadi. Main.cpp: 152-da segfaultning eng katta sabablari learningRate - uninitialized marker (Valgrindning ogohlantirishi) yoki epsiode yoki learningRate ga havola qilingan dinamik qator.
qo'shib qo'ydi muallif John Bollinger, manba
2. Bir nechta fayllar orasida manba bo'linishida gdb yoki ko'pchilik boshqa nosozliklarni tuzatuvchi uchun maxsus yoki odatiy bo'lmagan muammo mavjud emas. Ko'p manbadan tuzilgan dasturni tuzatmoqda. Agar xato tuzatuvchi main.cpp ni topsa (agar bu mumkin bo'lsa) va siz boshqa manbalarning nisbatan joylarini o'zgartirmadingiz, unda boshqalar ham topiladi.
qo'shib qo'ydi muallif John Bollinger, manba
Ritorik savol: "kod" (int qism, epizod berilgan bo'lsa, pastki tananing birinchi yinelemesinin boshida epizod qiymatining qiymati nima?
qo'shib qo'ydi muallif John Bollinger, manba
Ritorik savol: "kod" (int qism, epizod berilgan bo'lsa, pastki tananing birinchi yinelemesinin boshida epizod qiymatining qiymati nima?
qo'shib qo'ydi muallif John Bollinger, manba
Savolim oxirida main.cpp qismlarini qo'shib qoldim, bu erda learningRate mavjud. learningRate nima uchun uninitialized işaretçi bo'lishi kerakligini bilmayman
qo'shib qo'ydi muallif Enrico Anderlini, manba
Savolim oxirida main.cpp qismlarini qo'shib qoldim, bu erda learningRate mavjud. learningRate nima uchun uninitialized işaretçi bo'lishi kerakligini bilmayman
qo'shib qo'ydi muallif Enrico Anderlini, manba
Katta rahmat! Sinashni boshlamaganimda sinfda xatoliklarni qidirishga harakat qilaman, bu haqda bir necha soat sarflaganimga ishonmayman.
qo'shib qo'ydi muallif Enrico Anderlini, manba
Katta rahmat! Sinashni boshlamaganimda sinfda xatoliklarni qidirishga harakat qilaman, bu haqda bir necha soat sarflaganimga ishonmayman.
qo'shib qo'ydi muallif Enrico Anderlini, manba
Agar javob yuborsangiz, men uni hal qilaman
qo'shib qo'ydi muallif Enrico Anderlini, manba
Agar javob yuborsangiz, men uni hal qilaman
qo'shib qo'ydi muallif Enrico Anderlini, manba

6 javoblar

Yangi savolga qo'shgan kodingiz paydo bo'lganda, muammo epizode o'zgaruvchisini ishga tushirmaganingiz uchun paydo bo'ladi. Agar belgilashdan oldin qiymatdan foydalanadigan har qanday kodning xatti-harakati aniqlanmagan bo'lsa, shuning uchun dastur boshqa muhitda boshqacha tarzda ishlaydi.

2
qo'shib qo'ydi

Yangi savolga qo'shgan kodingiz paydo bo'lganda, muammo epizode o'zgaruvchisini ishga tushirmaganingiz uchun paydo bo'ladi. Agar belgilashdan oldin qiymatdan foydalanadigan har qanday kodning xatti-harakati aniqlanmagan bo'lsa, shuning uchun dastur boshqa muhitda boshqacha tarzda ishlaydi.

2
qo'shib qo'ydi

Segmentatsiya xatosi yaroqsiz xotiraga kirishni ko'rsatadi. Odatda, bu sizning fikringizcha, siz o'qiyapsizmi yoki biror qator oxirigacha yozilgan yoki noto'g'ri ko'rsatgich yoki allaqachon bo'shatilgan ob'ekt orqali yozasiz. Xatolik yuzaga keladigan joyda bo'laklash xatoligini talab qilmaysiz; Masalan, arrayning oxirini o'tmishdagi metadata ustiga yozib qo'yishingiz mumkin, bu sizning aloqasiz ob'ektni ajratish yoki chiqarishga harakat qilayotganingizda, keyinchalik buzilishlar keltirib chiqaradi. Shunday qilib, dastur bir tizimda ishlashga o'xshaydi, ammo boshqasiga tushib qoladi.

Bunday holda, men learningRate [episode] ga qarab boshlayman. epizod qiymatining qiymati nima? learningRate chegarasi ichida bo'ladimi?

2
qo'shib qo'ydi

Segmentatsiya xatosi yaroqsiz xotiraga kirishni ko'rsatadi. Odatda, bu sizning fikringizcha, siz o'qiyapsizmi yoki biror qator oxirigacha yozilgan yoki noto'g'ri ko'rsatgich yoki allaqachon bo'shatilgan ob'ekt orqali yozasiz. Xatolik yuzaga keladigan joyda bo'laklash xatoligini talab qilmaysiz; Masalan, arrayning oxirini o'tmishdagi metadata ustiga yozib qo'yishingiz mumkin, bu sizning aloqasiz ob'ektni ajratish yoki chiqarishga harakat qilayotganingizda, keyinchalik buzilishlar keltirib chiqaradi. Shunday qilib, dastur bir tizimda ishlashga o'xshaydi, ammo boshqasiga tushib qoladi.

Bunday holda, men learningRate [episode] ga qarab boshlayman. epizod qiymatining qiymati nima? learningRate chegarasi ichida bo'ladimi?

2
qo'shib qo'ydi

sarsa.cpp tashqi faylini disk raskadrovka qilishga urinish mavjudmi yoki yo'qmi, deb o'ylayman, chunki menimcha, bu sinfning tovlamachilik punkti bo'lishi mumkin

It's possible to set breakpoints in functions other than main.cpp.

to'xtatish manzil

     

Berilgan manzilida nuqtasida to'xtash nuqtasini o'rnating, bu funktsiya nomini, chiziq raqamini yoki ko'rsatmalar manzilini ko'rsatishi mumkin.

Hech bo'lmasa, sizning savolingiz shu. Shuningdek, siz qanday qilib ma'lumotni funktsiyalarga qadam qo'shish .

Eng muhimi, sizning vositalaringiz sizga nimani aytib berishni o'rganishingiz kerak. Agar segfault sizga tegishli bo'lmagan xotira xotirasidagi operatsion tizimning reaktsiyasidir. Buning sabablaridan biri shuki, NULL parametrini o'zgartirishga harakat qilmoqda. Boshqasi, hech qachon boshlanmaydigan ko'rsatgichni rad etishga urinadi. Valgrind xato xabari sizning tanlangan belgilaringiz bo'lishi mumkinligini ko'rsatadi.

Kodsiz, men sizning uy tizimingizda dasturni ishga tushirganingizda ko'rsatgich nima uchun boshlanmasligini aytib berolmayman, lekin ishda ishga tushirilganda (boshlangunicha) ishga tushiriladi. Sizning uyingizda kerakli ma'lumotlarga ega bo'lmasligingizdan shubhalanaman, ammo siz buni tekshirishingiz va tushunishingiz kerak. O'zingizdan so'rashni davom ettirishning asosiy savoliga "mening uy kompyuterim bilan ishlaydigan ishchi kompyuter o'rtasida qanday farq bor?"

0
qo'shib qo'ydi

sarsa.cpp tashqi faylini disk raskadrovka qilishga urinish mavjudmi yoki yo'qmi, deb o'ylayman, chunki menimcha, bu sinfning tovlamachilik punkti bo'lishi mumkin

It's possible to set breakpoints in functions other than main.cpp.

to'xtatish manzil

     

Berilgan manzilida nuqtasida to'xtash nuqtasini o'rnating, bu funktsiya nomini, chiziq raqamini yoki ko'rsatmalar manzilini ko'rsatishi mumkin.

Hech bo'lmasa, sizning savolingiz shu. Shuningdek, siz qanday qilib ma'lumotni funktsiyalarga qadam qo'shish .

Eng muhimi, sizning vositalaringiz sizga nimani aytib berishni o'rganishingiz kerak. Agar segfault sizga tegishli bo'lmagan xotira xotirasidagi operatsion tizimning reaktsiyasidir. Buning sabablaridan biri shuki, NULL parametrini o'zgartirishga harakat qilmoqda. Boshqasi, hech qachon boshlanmaydigan ko'rsatgichni rad etishga urinadi. Valgrind xato xabari sizning tanlangan belgilaringiz bo'lishi mumkinligini ko'rsatadi.

Kodsiz, men sizning uy tizimingizda dasturni ishga tushirganingizda ko'rsatgich nima uchun boshlanmasligini aytib berolmayman, lekin ishda ishga tushirilganda (boshlangunicha) ishga tushiriladi. Sizning uyingizda kerakli ma'lumotlarga ega bo'lmasligingizdan shubhalanaman, ammo siz buni tekshirishingiz va tushunishingiz kerak. O'zingizdan so'rashni davom ettirishning asosiy savoliga "mening uy kompyuterim bilan ishlaydigan ishchi kompyuter o'rtasida qanday farq bor?"

0
qo'shib qo'ydi