在ubuntu12下,写了一个C++模块和tcl脚本,结果运行出现Segmentation fault错误,这一般是C++程序的问题。怎么调试呢?
使用Kdevelop4调试ns(kdevelop的安装在ubuntu的软件中心搜索可以找到),首先(不是必须的),在ns的Makefile文件中,把CCOPT = -wall 改为CCOPT = -wall -g,可以输出调试信息。
当Attach to process时,弹出Operation not permitted的错误,通过以下语句解决了:
sudo chmod +s /usr/bin/gdb
而用$ echo 0 > /proc/sys/kernel/yama/ptrace_scope或setting ptrace_scope to 0 in /etc/sysctl.d/10-ptrace.conf我没弄成功。
这时候,点菜单栏上Run->Continue让ns继续运行,然后在控制台的%提示符下,输入source ****.tcl,程序出现错误并暂停,可以看到kdevelop的输出窗口中用箭头显示了出错调用的地方。
我调试的时候又出了一个错误
(1)warning: no class variable ClassName::debug_
see tcl-object.tcl in tclcl for info about this warning.
将ns-default.tcl文件中加入 ClassNameset debug_ 0,重新编译即可.
调试出现的第二个错误:
(2)warning: using backward compatibility mode
error when calling class OldSim: test.tcl
原来是在调试时应该输入source ******.tcl的,结果我输成了ns ******.tcl了,所以报了上面的错误。
(3) terminate called after throwing an instance of 'std::length_error'
what(): vector::_M_fill_insert
这个错误是说vector.resize(N)错了,可能是N太大了。 当然我们实际程序肯定不会让N弄得太大的,
这往往是因为N忘记了赋值或者从文件总读入N的数值没有读对,造成了N非常大。
调试ns代码还可以用gdb了。在终端输入gdb ns,然后输入r ********.tcl,就可以看到错误信息了,这个挺好用的。
下面是转载的kdevelop调试ns2的具体步骤
原文转自:http://www.baisi.net/redirect.php?tid=1617581&goto=newpost+自己实践
在Ubuntu系统下使用Kdevelop调试NS的方法:
其中包含了解决断点无效的问题。
1.在软件包管理那里选择Kdevelop的相关组件安装好
2.在NS目录下,对Makefile文件进行如下改动:
在代码里面添加调试信息:修改
Makefile(没有任何后缀的)将里面
CCOPT = -wall
#如果是 ns-allinone-2.28,这里是 CCOPT = -O2
STATIC =
LDFLAGS = $(STATIC)
LDOUT = -o $(BLANK)
改变为:
CCOPT = -wall -g #如果是 ns-allinone-2.28,这里修改为 CCOPT = -O2 -g
STATIC =
LDFLAGS = $(STATIC)
LDOUT = -o $(BLANK)
3. 然后重新编译
注意:以下步骤一个都不能少
Make clean
Make depend(我做一步时好像有错误提示,不过好像对结果没影响)
Make
(自己注:好像不需要make
install)。
4.把Makefile改名为Makefile.am
5.打开Kdevelop,选择"Project"->"Import Existing
Project"。在Directory里面选择NS的目录(Makefile所在的那个目录),Project
Name自己取一个名字,Project type选择"Generic C++ Application(Custom
Makefiles)".然后选"OK"。再选"Populate",搞定。
6.把Makefile.am 改回名字Makefile 之前碰到过断点设置无效的问题,后来发现是因为在Makefile里面没有加-g选项(即第二步) 之后就可以进行调试了: 1.在终端输入ns,回车。 2.在Kdevelop中选择菜单命令“Debug/Attach to process”,在对话框中找到刚刚运行的NS 进程,按OK (自己注:这里碰到一个问题,一直提示没有kdevelop中定义的名字,将kdevelop中project的名字定义为ns就解决了,可以调试。) 3.在终端输入tcl命令,例如“source test.tcl”,回车。 4.设置断点(如果是在一开始就设断点的话是无效的) 5.然后选择Debug中的命令Continue让程序继续运行。就可以看到调试的结果了