解决一个Linux下C语言工程无法调试的问题

准备跟一下iostat(包含在sysstat软件包中)的源码。在Eclipse中新建一个Makefile工程,导入sysstat 9.1.3的源代码。代码可以通过编译,编译出来的iostat也可以正常运行。然而,在Eclipse调试运行却提示"function 'main' not defined",代码中的断点也都不起作用。

在命令行下用gdb调试,在main函数上设置断点时也会提示"function 'main' not defined"。

将iostat用objdump反汇编,在汇编代码中看到一处"call __libc_start_main"。于是在gdb中在__libc_start_main函数上设断点,成功,单步跟踪,然而跟到libc-start.c中的"result = main (argc, argv, __environ MAIN_AUXVEC_PARAM)"这一行就再也跟不进去了。

在Eclipse中建一个对比C工程,编译,然后用objdump反汇编,发现该反汇编结果中的"Symbol table '.symtab'"含有符号"main",然而前面反汇编的iostat中却没有。

于是考虑是不是两个工程的gcc编译参数不一样,于是进行比较:

iostat:
编译:
gcc -o iostat.o -c -g3 -O0 -Wall -Wstrict-prototypes -pipe -O0 -DSA_DIR=/"/var/log/sa/" -DSADC_PATH=/"/usr/local/lib/sa/sadc/" -DUSE_NLS -DPACKAGE=/"sysstat/" -DLOCALEDIR=/"/usr/local/share/locale/" iostat.c
链接:
gcc -o iostat -g3 -O0 -Wall -Wstrict-prototypes -pipe -O0 iostat.o librdstats.a libsyscom.a -s

对比C工程:
编译:
gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"ttt.d" -MT"ttt.d" -o"ttt.o" "../ttt.c"
链接:
gcc -o"testtest" ./ttt.o

参数相差的还不少,经过一番查阅资料,发现问题出在iostat链接参数中的"-s"上,gcc手册上写"-s"的作用是"Remove all symbol table and relocation information from the executable"。

于是进入sysstat工程的Makefile,将"LFLAGS"里的"-s"删掉。这样再编译的iostat就可以正常调试了。自己对gcc了解不多,这个小问题就折腾了半天,也让我学到不少。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信雅达科技股份有限公司是一家在软件开发领域有着丰富经验的公司,而Linux C应用工程师是该公司技术团队中非常重要的一员。作为一名Linux C应用工程师,主要负责开发和维护基于Linux操作系统的C语言应用程序。 首先,作为一名Linux C应用工程师,我们需要熟悉Linux操作系统的基本原理和内核知识。Linux是一种开源的操作系统,用户可以根据需求自定义和配置,因此我们需要了解并熟悉Linux的文件系统、进程管理、内存管理、设备驱动以及网络通信等方面的知识。 其次,在C语言方面,作为Linux C应用工程师,我们需要具备扎实的编程基础和高效的编码能力。我们需要精通C语言,并且熟悉Linux下的编程环境、开发工具和调试技巧。我们需要使用C语言开发和维护各种应用程序,例如设备驱动程序、系统级应用程序、网络通信程序等。 除了基本的Linux操作系统和C语言知识外,作为Linux C应用工程师,我们还需要具备团队合作和解决问题的能力。由于在项目开发过程中,我们可能需要与其他团队成员进行协作,以确保项目的顺利进行。此外,当遇到问题或bug时,我们需要有良好的问题解决能力和调试技巧,以快速定位和修复问题。 综上所述,信雅达科技股份有限公司的Linux C应用工程师笔试将主要考察对Linux操作系统和C语言的掌握程度,以及在实际项目开发中的团队合作和问题解决能力。对于想要参加该公司笔试的应聘者来说,需要提前充分准备,复习相关知识,并不断提升自己的编程和解决问题的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值