我正在编写一段代码来检查文件是否存在。当用户传入一个仅带有名称(无斜杠)的文件参数时,我将使用 PATH 环境变量中的路径检查该文件是否存在。我在 Ubuntu 上用 gcc 编译并且一直在使用 gdb。我找到了导致 SIGABRT 的线路,但不确定信息告诉我什么。这是我第一次使用 gdb。这是我的片段:
char* PATH = NULL;
PATH = (char*)getenv( "PATH" );
char* pathtoken = strtok( PATH, ":" );
int index = 0;
while ( pathtoken != NULL )
{
index++;
printf( "%s\n", pathtoken );
char* pathdir = (char*)malloc( sizeof(pathtoken) );
strcpy( pathdir, pathtoken );
GetFullPath( pathdir, filename );
inputstream = fopen( pathdir, "r" );
if ( inputstream != NULL)
{
free( pathdir );
break;
}
free( pathdir );
pathtoken = strtok( NULL, ":" );
}
char* GetFullPath( char* dirpath, char* filename )
{
//Append back slash
int len = strlen(dirpath);
dirpath[len] = '/';
dirpath[len+1] = '\0';
return strcat( dirpath, filename );
}
它发生在 fopen 行的第一次迭代中。这是我的 gdb 输出
启动程序:/home/seapoe/Documents/OsClass/CodePractice/a.out text1 /usr/lib/lightdm/lightdm
断点 1,主要 (argc=2, argv=0xbffff3a4) 在 xssh.c:87
87 GetFullPath(路径目录,文件名);
(gdb) 下一个
89 输入流 = fopen(路径目录,“r”);
(gdb) 打印路径目录
$5 = 0x804c008 "/usr/lib/lightdm/lightdm/text1"
(gdb) 打印路径目录[strlen(pathdir)]
$6 = 0 '\000'
(gdb) 打印路径目录[strlen(pathdir)+1]
$7 = 0 '\000'
(gdb) 打印路径目录[strlen(pathdir)+2]
$8 = 0 '\000'
(gdb) 打印路径目录[strlen(pathdir)-1]
$9 = 49 '1'
(gdb) 下一个
* 检测到 glibc/home/seapoe/Documents/OsClass/CodePractice/a.out:free():下一个尺寸无效(正常):0x0804c018 * *
======= 回溯:=========
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb7e97ee2]
/lib/i386-linux-gnu/libc.so.6(+0x65db5)[0xb7e87db5]
/lib/i386-linux-gnu/libc.so.6(fopen+0x2b)[0xb7e87deb]
/home/seapoe/Documents/OsClass/CodePractice/a.out[0x8048a77]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb7e3b4d3]
/home/seapoe/Documents/OsClass/CodePractice/a.out[0x8048771]
======= 内存映射:========
08048000-0804a000 r-xp 00000000 08:01 536263 /home/seapoe/Documents/OsClass /CodePractice/a.out
0804a000-0804b000 r--p 00001000 08:01 536263 /home/seapoe/Documents/OsClass/CodePractice/a.out
0804b000-0804c000 rw-p 00002000 08:01 536263 /home/seapoe/Documents/OsClass/CodePractice/a.out
0804c000-0806d000 rw-p 00000000 00:00 0 [堆]
b7df3000-b7e0f000 r-xp 00000000 08:01 394136 /lib/i386-linux-gnu/libgcc_s.so.1
b7e0f000-b7e10000 r--p 0001b000 08:01 394136 /lib/i386-linux-gnu/libgcc_s.so.1
b7e10000-b7e11000 rw-p 0001c000 08:01 394136 /lib/i386-linux-gnu/libgcc_s.so.1
b7e21000-b7e22000 rw-p 00000000 00:00 0
b7e22000-b7fc5000 r-xp 00000000 08:01 394115 /lib/i386-linux-gnu/libc-2.15.so
b7fc5000-b7fc7000 r--p 001a3000 08:01 394115 /lib/i386-linux-gnu/libc-2.15.so
b7fc7000-b7fc8000 rw-p 001a5000 08:01 394115 /lib/i386-linux-gnu/libc-2.15.so
b7fc8000-b7fcb000 rw-p 00000000 00:00 0
b7fd9000-b7fdd000 rw-p 00000000 00:00 0
b7fdd000-b7fde000 r-xp 00000000 00:00 0 [vdso]
b7fde000-b7ffe000 r-xp 00000000 08:01 394095 /lib/i386-linux-gnu/ld-2.15.so
b7ffe000-b7fff000 r--p 0001f000 08:01 394095 /lib/i386-linux-gnu/ld-2.15.so
b7fff000-b8000000 rw-p 00020000 08:01 394095 /lib/i386-linux-gnu/ld-2.15.so
bffdf000-c0000000 rw-p 00000000 00:00 0 [堆栈]
程序收到信号 SIGABRT,已中止。
__kernel_vsyscall() 中的 0xb7fdd424
调用 GetFullPath 后,您可以看到在 fopen 调用之前返回了一个有效路径