【学习笔记】Linux文件编译调试相关(问题未解决)

2024-06-12 1531阅读
//-I意为include 指定头文件搜索路径 -l:告诉编译器链接时需要的库
gcc *.c -I /usr/include/fastdfs/ -I /usr/include/fastcommon/ -l fdfsclient
//调试
 gcc -g -rdynamic main.c

如何解决 “ 段错误(吐核) ” ???

【学习笔记】Linux文件编译调试相关(问题未解决)
(图片来源网络,侵删)

【线上排错】记一次Linux的“段错误(吐核)”排查步骤

Centos 开始Core调试

[Linux] 什么是 段错误(吐核)?

Linux环境下段错误的产生原因及调试方法小结

跟着视频操作,运行代码出现

[fish@localhost mytest]$ ./a.out
段错误(吐核)

参考了上述连接不断调试,并且反复校对代码和视频以及资料中的差别,无果

最后得到的调试信息是

(gdb) run
Starting program: /home/fish/mytest/./a.out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7874a4a in __GI__IO_str_overflow (fp=0x7fffffffd2c0, c=91) at strops.c:133
133         *fp->_IO_write_ptr++ = (unsigned char) c;

个人感觉是哪个地方的读写出了问题,导致内存访问溢出了之类的,但是没找到具体是哪个语句的调用出了问题。先记一下,后续有时间再调。要是有知道哪儿出问题的大佬,请不吝赐教!

对应调用出错位置代码:

(gdb) l
128               fp->_IO_write_end = fp->_IO_buf_end;
129             }
130         }
131     
132       if (!flush_only)
133         *fp->_IO_write_ptr++ = (unsigned char) c;
134       if (fp->_IO_write_ptr > fp->_IO_read_end)
135         fp->_IO_read_end = fp->_IO_write_ptr;
136       return c;
137     }
(gdb) l
138     libc_hidden_def (_IO_str_overflow)
139     
140     int
141     _IO_str_underflow (_IO_FILE *fp)
142     {
143       if (fp->_IO_write_ptr > fp->_IO_read_end)
144         fp->_IO_read_end = fp->_IO_write_ptr;
145       if ((fp->_flags & _IO_TIED_PUT_GET) && (fp->_flags & _IO_CURRENTLY_PUTTING))
146         {
147           fp->_flags &= ~_IO_CURRENTLY_PUTTING;

贴下源码:

main.c

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "fdfs_upload_file.h"
int main(int argc,const char* argv[]){
  char fileID[1024] = {0};
  upload_file1("/etc/fdfs/client.conf","main.c",fileID);
  printf("fileID:%s\n",fileID);
  printf("==================\n");
  upload_file2("/etc/fdfs/client.conf","main.c",fileID,sizeof(fileID));
  printf("fileID:%s\n",fileID);
  return 0;
}

fdfs_upload_file.h

#ifndef _FDFS_UPLOAD_FILE_H
#define _FDFS_UPLOAD_FILE_H
int upload_file1(const char* confFile, const char* localFile, char* fileID);
int upload_file2(const char* confFile, const char* localFile, char* fileID, int bufLen);
#endif

fdfs_upload_file.c

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "fdfs_client.h"
#include "fdfs_upload_file.h"
int upload_file1(const char* confFile,const char* localFile,char* fileID)
{
	char group_name[FDFS_GROUP_NAME_MAX_LEN + 1];
	ConnectionInfo *pTrackerServer;
	int result;
	int store_path_index;
	ConnectionInfo storageServer;
	
	if ((result=fdfs_client_init(confFile)) != 0)
	{
		return result;
	}
	pTrackerServer = tracker_get_connection();
	if (pTrackerServer == NULL)
	{
    fdfs_client_destroy();
		return errno != 0 ? errno : ECONNREFUSED;
	}
	*group_name = '\0';
	if ((result=tracker_query_storage_store(pTrackerServer, \
	                &storageServer, group_name, &store_path_index)) != 0)
	{
		fdfs_client_destroy();
		fprintf(stderr, "tracker_query_storage fail, " \
			"error no: %d, error info: %s\n", \
			result, STRERROR(result));
		return result;
	}
	result = storage_upload_by_filename1(pTrackerServer, \
			&storageServer, store_path_index, \
			localFile, NULL, \
			NULL, 0, group_name, fileID);
	if (result == 0)
	{
		printf("%s\n", fileID);
	}
	else
	{
		fprintf(stderr, "upload file fail, " \
			"error no: %d, error info: %s\n", \
			result, STRERROR(result));
	}
	tracker_disconnect_server_ex(pTrackerServer, true);
	fdfs_client_destroy();
	return result;
}
//多进程实现
int upload_file2(const char* confFile,const char* localFile,char* fileID,int bufLen){
  //创建管道
  int fd[2];
  int ret=pipe(fd);
  if(ret==-1){
    perror("pipe reeor");
    exit(0);
  }
  //创建子进程
  pid_t pid = fork();
  //如果是子进程
  if(pid==0){
    //3.标准输出重定向 -》管道的写端
    dup2(fd[1],STDOUT_FILENO);
    //4.关闭读端
    close(fd[0]);
    //5。执行execlp命令
    execlp("fdfs_upload_file","xxx",confFile, localFile, NULL);
    perror("execlp error");
  }
  else{
    //父进程,读管道
    //关闭写端
    close(fd[1]);
    
    read(fd[0],fileID,bufLen);
    //回收pcb-》子进程
    wait(NULL);
  }
}
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]