몇일전에 올린문제인데 아직 해결이 안되서(Segmentation fault)
//tsdbsvr.c
#include "apcommon.h"
#include "apconfig.h"
main(int argc, char** argv)
{
#ifdef _DEBUG_
printf("시작\n");
#endif
infSetUserParm(&gstUserParm, argc, argv);
infInitProcess(argc, argv);
infMainRoutine(&gstUserParm);
infTermProcess();
}
//apconfig.c
#include "apcommon.h"
int infSetUserParm(SUserParm_T *pUser, int argc, char **argv)
{
char szFileName[256];
char *pPath;
gpAppName = argv[0];
infCpyUserParm(pUser);
if ( argc == 2 ) {
sprintf(szFileName, "%s", argv[1]);
} else {
if ( (pPath = getenv("CFG_DIR")) != NULL ) {
sprintf(szFileName, "%s/%s.cfg", pPath, argv[0]);
} else {
sprintf(szFileName, "%s.cfg", argv[0]);
}
}
#if 0
fprintf(stdout, "CONFIG FILE NAME[%s]\n", szFileName);
#endif
return infSetUserparm(pUser, szFileName);
}
int infSetUserparm(SUserParm_T *pUser, char *szFileName)
{
return RETOK;
}
//apcommon.c
static SUserParm_T *gpstUser;
void infCpyUserParm(SUserParm_T *pUser) { gpstUser = pUser; }
실행하면 Segmentation fault (core dump)납니다
그때 디버그툴 gdb를 사용하라는 말에 몇일 공부했지만 이유를 모르겠습니다.
조금만 더 도와주세요
gdb 결과입니다
(gdb) run
Starting program: /home/techno/bin/tsdbsvr
[New Thread 1024 (LWP 1440)]
시작
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1024 (LWP 1440)]
0x0804e6cd in infSetUserparm (pUser=0x844f3c0,
szFileName=0xbffff97c "/home/techno/bin/tsdbsvr.cfg") at apconfig.c:810
810 {
(gdb) bt
#0 0x0804e6cd in infSetUserparm (pUser=0x844f3c0,
szFileName=0xbffff97c "/home/techno/bin/tsdbsvr.cfg") at apconfig.c:810
#1 0x0804e6b0 in infSetUserParm (pUser=0x844f3c0, argc=1, argv=0xbffffb04)
at apconfig.c:806
#2 0x0804ac07 in main (argc=1, argv=0xbffffb04)
at /home/techno/src/tsdbsvr.c:1186
#3 0x40046545 in __libc_start_main () from /lib/libc.so.6
Re: 몇일전에 올린문제인데 아직 해결이 안되서(Segmentation fa
에러 안나던데요..
소스의 나머지 부분이 없어서 SUserParm_T는 int로,
RETOK는 0으로, gstUserParm은 SUserParm_T형
전역변수로 선언하여 두고 실행시켜보았습니다.
소스를 봐도 에러 날만한 부분은 없는데요..
혹시 sprintf가 정확히 링크가 안된건 아닐지.. 헤더 파일이
정확히 포함되었는지 확인해 보세요..
소스가 전부 있는 것도 아니고, 어떤 식으로 실행시켰는지도
설명이 없어서 더 이상은.. 죄송..
http://blog.dreamwiz.com/shjii
sprintf는 만들어질 문자열의 길이를 확실히 알고 있을 때만 쓰고 그
sprintf는 만들어질 문자열의 길이를 확실히 알고 있을 때만 쓰고 그렇지 않는 경우에는 쓰지 말아야 합니다. buffer overflow attack을 받을 수 있는 대표적인? 함수 중 하나입니다. snprintf를 쓰기 바랍니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
sprintf에는 cinsk님이 지적한 잠재적인 문제점이 있긴 하지만,
sprintf에는 cinsk님이 지적한 잠재적인 문제점이 있긴 하지만, bt 출력을 보니
버퍼 오버런은 아닌 것 같습니다. 디버거에서 그냥 run하지 마시고 break, step,
print 등을 써서 추적을 해보세요.
음 모두들 답변주세서 감사합니다....문제점은
문제점은 어느 코드상의 문제점이 아닌 스택사이즈오버였습니다....--;;
1M가 max였는데 4M를 사용해서스리...
답변주신여러분들께 감사드립니다...
댓글 달기