解决一个Linux下C语言工程无法调试的问题
2010-07-17 20:03
411 查看
准备跟一下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了解不多,这个小问题就折腾了半天,也让我学到不少。
在命令行下用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了解不多,这个小问题就折腾了半天,也让我学到不少。
相关文章推荐
- Linux环境下段错误的产生原因及调试方法小结 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多、花费时间最长的问题就是
- 解决Python工程依赖包无法自动安装的问题(Linux环境下)
- 旧版本Xcode工程在Xcode4.5下真机无法调试问题的解决
- Face Alignment at 3000FPS(C++版)工程配置一个大问题的解决
- vs.net2003中解决"无法在web服务器上启动调试"问题一例
- 解决linux安装nvidia驱动后无法调节亮度的问题
- 关于real210开发板linux系统可能无法解析域名的问题解决方法
- 触发器(当2个表中的相应值改变时同时改变一个表中的一个字段)(同时有处理“无法解决 equal to 操作的排序规则冲突”问题)
- 3.通过进入单用户模式解决linux中的rc.local修改后无法启动的问题
- 关于目标跟踪matlab代码调试时一个问题的解决办法
- 解决:eclipse 断点调试进入到class文件,无法查看变量值问题
- 解决ThinkPHP中开启调试模式无法加载模块的问题
- 解决Linux下yum安装无法解析URL的问题
- 通过进入单用户模式解决linux中的rc.local修改后无法启动的问题
- PL/SQL Developer中,存储过程无法调试的问题解决办法
- Linux中无法远程连接数据库问题的解决方法
- 解决 vc++2008 无法调试问题
- Linux下搭建redis并解决无法连接redis的问题
- linux下mysql 使用mysql -uroot -p输入密码无法登录问题的解决
- linux复制虚拟机网卡无法使用及新增网卡不被识别问题解决