我正在虛擬機中運行程序。我正在執行一個循環,在某個時候,我調用了strcat。在一個數字(這個數字在不同的執行之間改變)之後,我收到了分段錯誤。strcat造成循環中的段錯誤
我試圖調試它:
(gdb) backtrace
0 0x001a3d5d in strcat() from /lib/tls/i686/cmov/libc.so.6
1 0x080493f4 in ChangetoDnsNameFormat (dns=0xbffef313 "",
host=0xbffff3b8 "a.com", '.' <repeats 195 times>...) at my_dns.c:378
2 0x08048c96 in nreplacehost (
host=0xbffff3b8 "a.com", '.' <repeats 195 times>..., query_type=1,
ip=0xbffff354 "3.3.3.3") at my_dns.c:179
3 0x080489a1 in main (argc=774778414, argv=0xbffff4d4) at my_dns.c:106
(gdb) frame 1
1 0x080493f4 in ChangetoDnsNameFormat (dns=0xbffef313 "",
host=0xbffff3b8 "a.com", '.' <repeats 195 times>...) at my_dns.c:378
378 strcat((char*)host,".");
(gdb) print host
6 = (unsigned char *) 0xbffff3b8 "a.com", '.' <repeats 195 times>...
任何提示嗎?
這是我稱之爲strcat的
void ChangetoDnsNameFormat(unsigned char* dns,unsigned char* host)
{
int lock = 0 , i;
strcat((char*)host,".");
for(i = 0 ; i < strlen((char*)host) ; i++)
{
if(host[i]=='.')
{
*dns++ = i-lock;
for(;lock<i;lock++)
{
*dns++=host[lock];
}
lock++; //or lock=i+1;
}
}
*dns++='\0';
}
這個函數調用成功的1000倍以上的功能。
我們可以看到ChangetoDnsNameFormat嗎?它可能有幫助 – lucasg 2013-04-30 07:12:52
在這些情況下通常會出錯的地方在於你寫過數據結構的末尾。前兩次你很幸運,那個結構之後的內存仍然在你的地址空間中,但是在某些時候你寫的超出了進程本身的地址空間,那就是當內核用SIGSEGV敲你時。 – izak 2013-04-30 07:19:55
你爲'host'分配了多少空間? – sapi 2013-04-30 07:21:05