|
|
|
Segmentation fault (C & Mysql & unix)
|
|||
|---|---|---|---|
|
#18+
Здраствуйте! Подскажите пожалуйста что за ошибка и как лечится! Вылетает при запуске мой программки. Прога конектится и делает запрос БД, выполняет mysql_store_result() и mysql_num_rows А после эта ошибка. Далее прога должна в цикле выполнить mysql_fetch_row() и вывести результат,ну а после mysql_free_result и mysql_close. Хех. А вот исходник: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 08:13 |
|
||
|
Segmentation fault (C & Mysql & unix)
|
|||
|---|---|---|---|
|
#18+
Ну судя повсему должно быть MYSQL_ROW* row; убери двойноую обработку ошибки коннекта и ежели пишешь на С++ не юзай exit. только return ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 08:36 |
|
||
|
Segmentation fault (C & Mysql & unix)
|
|||
|---|---|---|---|
|
#18+
Ежели сделать так MYSQL_ROW* row то ошибка несовместимости типов! Пишу на С. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 09:23 |
|
||
|
Segmentation fault (C & Mysql & unix)
|
|||
|---|---|---|---|
|
#18+
Ну тогда не знаю, но проблема в том что в цикле идет обращение за пределы адресного пространства процесса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 09:34 |
|
||
|
Segmentation fault (C & Mysql & unix)
|
|||
|---|---|---|---|
|
#18+
Хмм. А мож косяк в библиотеке(libmysqlclient.so.15)??? Я засунул весь цикл в коментарии компильнул и таже ошибка, также после : Код: plaintext 1. При первом запуске он немог найти библиотеку(libmysqlclient.so.15), ну я ему и дал библиотеку в /usr/lib ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 09:58 |
|
||
|
Segmentation fault (C & Mysql & unix)
|
|||
|---|---|---|---|
|
#18+
Ну я не пророк, через кабель не вижу. Бери gdb, поизучай core gdb <имя программы> core скажи bt он стек прокажет, ну а дальше там есть встроенный help - вперед и с песней ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 10:18 |
|
||
|
Segmentation fault (C & Mysql & unix)
|
|||
|---|---|---|---|
|
#18+
Методом тыка и удалением кода дошел вот до такого кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Но после добавления строки: Код: plaintext 1. После последовал экспиримент: Код: plaintext 1. 2. Код: plaintext 1. 2. 3. тоесть косяк не в проге. В тоже время прога "mysql" пользует туже библиотеку и вполне работает! Как так? и что делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 11:26 |
|
||
|
Segmentation fault (C & Mysql & unix)
|
|||
|---|---|---|---|
|
#18+
Что делать, что делать... Я тебе сказал возьми core файл в debugger и посмотри стек. Но скорее всего у тебя что-то не так с ининциализацией мускула, - после mysql_init mysql == 0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 12:04 |
|
||
|
Segmentation fault (C & Mysql & unix)
|
|||
|---|---|---|---|
|
#18+
Все это похоже на то, что sizeof(MYSQL) в вашем коде отличен от того, который используется библиотекой, поскольку сам по себе mysql_init безобиден: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 12:34 |
|
||
|
Segmentation fault (C & Mysql & unix)
|
|||
|---|---|---|---|
|
#18+
2 Анатолий Широков И как такое вылечить?! Встретил вот такой код : Код: plaintext 1. А если так : Код: plaintext Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 12:47 |
|
||
|
Segmentation fault (C & Mysql & unix)
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковВсе это похоже на то, что sizeof(MYSQL) в вашем коде отличен от того, который используется библиотекой, поскольку сам по себе mysql_init безобиден: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Исходя из приведенного кода, указатель перед первым вызовом mysql_init надо обнулить, А то в белый свет как в копейку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 13:06 |
|
||
|
Segmentation fault (C & Mysql & unix)
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. 2. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 13:11 |
|
||
|
Segmentation fault (C & Mysql & unix)
|
|||
|---|---|---|---|
|
#18+
и я и змей не правы. Скорее всего взят неправильный h файл не от этой версии, в бибилотеке размер структуры MYSQL больше чем для mainю И mysql_init разваливает стек. Самое смешное что если работать не через автоматическую переменную, а использовать линамическую память, то все бы работало Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 13:49 |
|
||
|
Segmentation fault (C & Mysql & unix)
|
|||
|---|---|---|---|
|
#18+
Я бы всё-таки подождал пока он проверит этот наш обобщённый кусок. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 13:55 |
|
||
|
Segmentation fault (C & Mysql & unix)
|
|||
|---|---|---|---|
|
#18+
ZmeisheЯ бы всё-таки подождал пока он проверит этот наш обобщённый кусок. Код: plaintext 1. 2. Что здесь проверять - здесь будет утечка памяти и mysql как была NULL так ей и останется. В идеологии mysql_init, если вы передаете указатель, то должы его сохранить: Код: plaintext 1. Если передаете адрес на стековую переменную, то нужно лишь проверить код возврата: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 14:18 |
|
||
|
Segmentation fault (C & Mysql & unix)
|
|||
|---|---|---|---|
|
#18+
Ха, а слон-то на поверхности оказалася. Стек валится из-за того, что вы пытаетесь выводите структуру mysql, которая не является integer-ом, как integer, то есть следующий код и валит стек: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 14:22 |
|
||
|
Segmentation fault (C & Mysql & unix)
|
|||
|---|---|---|---|
|
#18+
Не-а, неправильно код возврата проверяешь! Он в случае успеха возвращает указатель на MYSQL? аллокированную им или предоставленную программером, неудача - возврат 0 Причем в ситуации когда программер предоставляет предоставляет свой объект код возврат будет нормальным (!=0), поскольку дальше идет только инициализация полей структуры. Но вот ежели размеры структур разные то при инициализаци будет развален стек процесса и все пойдет кувырком ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 14:28 |
|
||
|
Segmentation fault (C & Mysql & unix)
|
|||
|---|---|---|---|
|
#18+
Да, я уже заметил, но суть это не меняет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 14:29 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34563109&tid=2028776]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
169ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
74ms |
get tp. blocked users: |
1ms |
| others: | 246ms |
| total: | 536ms |

| 0 / 0 |
