Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |
Для начала стек увеличить. Тогда будет ясно 26.10.01 11:14 Число просмотров: 1103
Автор: ukv Статус: Незарегистрированный пользователь
|
В VC это вроде делается через Project Settings->Link->Output->Stack allocations
Размер по умолчанию 1 Мб, если подсказка не врет. Если при увеличении скажем до 2 Мб переполнение останется, то это скорее всего где-то бесконечная рекурсия. Если переполнение пропадет, то в программе просто избыток локальных переменных.
|
<programming>
|
[C++] Stack overflow 24.10.01 21:33
Автор: Лamo Статус: Незарегистрированный пользователь
|
Делаю прогу на VC
а тут сабж появляется, даже и не знаю что могло вызвать такой еррор
Что бы это???
|
 |
Вот что я делаю 26.10.01 11:31
Автор: Лamo Статус: Незарегистрированный пользователь
|
Хочю создать поток функцией AfxBeginThread
При отладке вылетаю в Thrdcore.cpp в функцию UINT APIENTRY _AfxThreadEntry(void* pParam)
в код
// first -- check for simple worker thread
DWORD nResult = 0;
if (pThread->m_pfnThreadProc != NULL)
{
nResult = (*pThread->m_pfnThreadProc)(pThread->m_pThreadParams);
ASSERT_VALID(pThread);
}
Как только дохожу до ASSERT_VALID появляеца мессага об переполнении стека
Что это?
|
 |  |
Вот что я делаю 26.10.01 15:58
Автор: ggg <ggg> Статус: Elderman
|
1) поставь внутри своей threadproc первым оператором return 0;
если глюк исчезнет - ищи его в threadproc
2) ты посмотрел что при ошибке видно в окошке CallStack ?
|
 |  |  |
Вот что я делаю 26.10.01 16:50
Автор: Лamo Статус: Незарегистрированный пользователь
|
кароче я поставил в начале функции потока return 0;
Всё равно глючит,
в окне стека вот что:
$$$00001() line 79
KERNEL32! bff88ef7()
KERNEL32! bff86966()
KERNEL32! bff86863()
Регистры:
EAX = 002678BC
EBX = 00000008
ECX = 01621F98
EDX = 8175DB80
ESI = 8175DB20
EDI = 81761D14
EIP = 004534D7
ESP = 0181FF90
EBP = 0181FF98
EFL = 00010202
CS = 015F DS = 0167
ES = 0167 SS = 0167
FS = 445F GS = 0000
OV=0 UP=0 EI=1 PL=0
ZR=0 AC=0 PE=0 CY=0
01621F98 = 00000000
ST0 = +0.00000000000000000e+0000
ST1 = +0.00000000000000000e+0000
ST2 = +0.00000000000000000e+0000
ST3 = +0.00000000000000000e+0000
ST4 = +0.00000000000000000e+0000
ST5 = +0.00000000000000000e+0000
ST6 = +0.00000000000000000e+0000
ST7 = +0.00000000000000000e+0000
CTRL = 0000
STAT = 0000
TAGS = 0000
EIP = 00000000
CS = 0000 DS = 0000
EDO = 00000000
Мемори:
00000000 ?? ?? ?? ?? ?? ?? ??????
00000006 ?? ?? ?? ?? ?? ?? ??????
0000000C ?? ?? ?? ?? ?? ?? ??????
00000012 ?? ?? ?? ?? ?? ?? ??????
00000018 ?? ?? ?? ?? ?? ?? ??????
0000001E ?? ?? ?? ?? ?? ?? ??????
00000024 ?? ?? ?? ?? ?? ?? ??????
|
 |  |  |  |
Вот что я делаю 26.10.01 17:35
Автор: ggg <ggg> Статус: Elderman
|
> кароче я поставил в начале функции потока return 0; > Всё равно глючит, > в окне стека вот что: > $$$00001() line 79 > KERNEL32! bff88ef7() > KERNEL32! bff86966() > KERNEL32! bff86863()
теперь хоть понятно, что это не зацикливание рекурсивных вызовов
1) а как у тебя threadproc объявлена ?
2) и как ты создаёшь thread ?
|
 |  |  |  |  |
Вот что я делаю 26.10.01 18:03
Автор: Лamo Статус: Незарегистрированный пользователь
|
кароче сначала я создаю поток, делаю некоторые действия,
при успешном выполнении действий, шлю мессагу - SendMessage функция которой запускает новый поток,
потоки создаю так:
HANDLE h;
DWORD dw;
if(h)
CloseHandle(h);
h = CreateThread(NULL, 0, thread, NULL, &dw);
сама функция потока:
DWORD WINAPI thread(void *Param)
{
return 0;
}
|
 |  |  |  |  |  |
Вот что я делаю 26.10.01 21:50
Автор: ggg <ggg> Статус: Elderman
|
если ты используешь MFC то и поток должен создавать через AfxBeginThread
|
 |
Для начала стек увеличить. Тогда будет ясно 26.10.01 11:14
Автор: ukv Статус: Незарегистрированный пользователь
|
В VC это вроде делается через Project Settings->Link->Output->Stack allocations
Размер по умолчанию 1 Мб, если подсказка не врет. Если при увеличении скажем до 2 Мб переполнение останется, то это скорее всего где-то бесконечная рекурсия. Если переполнение пропадет, то в программе просто избыток локальных переменных.
|
 |
[C++] Stack overflow 25.10.01 01:27
Автор: ggg <ggg> Статус: Elderman
|
> Делаю прогу на VC > а тут сабж появляется, даже и не знаю что могло вызвать > такой еррор > Что бы это???
у тебя глюк в проге
например зацикливание рекурсивных вызовов
когда эта ошибка произойдёт обрати внимание на окошо дебагера, где показаны вызовы функций (Call stack)
|
 |
[C++] Stack overflow 24.10.01 21:52
Автор: SEH Статус: Незарегистрированный пользователь
|
А оно когда появляется, когда пишешь прогу, или когда ее запускаешь?
|
 |  |
[C++] Stack overflow 24.10.01 22:32
Автор: Лamo Статус: Незарегистрированный пользователь
|
када отлаживаю, в определённх участках кода
|
 |  |  |
[C++] Stack overflow 26.10.01 00:21
Автор: SEH Статус: Незарегистрированный пользователь
|
Наверное, потому что, у тебя там бесконечная рекурсия(функция вызывает сама себя), может не напрямую, косвенно. Обычно именно из-за этого. ты ведь на с++ пишешь?
|
 |  |  |  |
[C++] Stack overflow 26.10.01 01:51
Автор: + <Mikhail> Статус: Elderman
|
A eche
1.mozhet byt` kogda ty vnutri funkcii ty declariruesh bolshoe kol-vo stack variables (local ili automatic)
2. C startup ne smoglo inicializirovat` stack space.
Mozhesh izmenit stack size :
1.v compilere /F
2.v linkere /STACK:
3.v .DEF file STACKSIZE
4.ispolzua util EDITBIN na gotovoom EXE
no esli ty uvelichish stack slishkom mnogo to to ne smozhet allocirovat` stack
|
 |  |  |  |  |
[C++] Stack overflow 26.10.01 09:46
Автор: Лamo Статус: Незарегистрированный пользователь
|
> 1.mozhet byt` kogda ty vnutri funkcii ty declariruesh > bolshoe kol-vo stack variables (local ili automatic)
В смысле??
|
|
|