Linux-GDB调试
时间:2022-03-10 18:08
r run 运行.程序还没有运行前使用 c cuntinue 运行到下一断点处 q quit 退出 tab tab 命令补全功能 h help 帮助 s step 跟入函数 n next 执行下一行的代码。如果是函数调用,也当作一行代码,执行到此函数返回 b breakpoint 设置断点,用法:(1)b 函数名 (2)b 文件名:行号
info b info breakpoints 查看断点数 del delete 删除断点:delete 断点号 l list 列出代码行。一次列10 行。 也可在 list 后面跟上 文件名:行号 watch watch 观察一个变量的值。每次中断时都会显示这个变量的值 what what 显示变量的类型 p print 打印一个变量的值。print 也可改变一个值,通过指令 p b = 100,变量b 的值就变成100了 start start 从主函数 main 开始运行调试 fin finish 运行直至当前函数返回
设置断点,用法:(1)b 函数名 (2)b 文件名:行号
watchpoint只能在当前scope里设置.
watchpoint在脱离scope后.所有失去scope的变量会被自动删除.
watchpoint监视的是内存值的变化.如果内存值被赋予了一个一样的值.那也不会起作用.
类似$arg0这些已经在gdb中定义的变量.
任何在当前 scpoe里的变量
定义了的字符,数字常量
预处理了的宏
语言里的条件判断
{ int i;
for (i = k; i*k <= n; i++) {
prime[i*k] = 0;
}
}
// worker thread routine
void *worker(int tn) // tn is the thread number (0,1,...)
{ int lim,base;
// no need to check multipliers bigger than sqrt(n)
lim = sqrt(n);
do {
// get next sieve multiplier, avoiding duplication across threads
pthread_mutex_lock(&nextbaselock);
base = nextbase += 2;
pthread_mutex_unlock(&nextbaselock);
if (base <= lim) {
work[tn]++; // log work done by this thread
// don‘t bother with crossing out if base is known to be
// composite
if (prime[base])
crossout(base);
}
else return;
} while (1);
}
main(int argc, char **argv)
{ int nprimes, // number of primes found
totwork, // number of base values checked
i;
void *p;
n = atoi(argv[1]);
nthreads = atoi(argv[2]);
for (i = 2; i <= n; i++)
prime[i] = 1;
crossout(2);
nextbase = 1;
// get threads started
for (i = 0; i < nthreads; i++) {
pthread_create(&id[i],NULL,(void *) worker,(void *) i);
}
// wait for all done
totwork = 0;
for (i = 0; i < nthreads; i++) {
pthread_join(id[i],&p);
printf("%d values of base done\n",work[i]);
totwork += work[i];
}
printf("%d total values of base done\n",totwork);
// report results
nprimes = 0;
for (i = 2; i <= n; i++)
if (prime[i]) nprimes++;
printf("the number of primes found was %d\n",nprimes);
}
为什么你的程序会崩溃?
在写c/c++程序时.最常见的崩溃就是
invalid access of memory 读取了没有权限的内存导致崩溃.出现这种情况时. 硬件会执行一个jump命令到操作系统.由操作系统处理.
调试时,内存是在Virtual Memory(VM)里模拟.这也是为了方便内存调试.
反应在xcode里就是segementation fault/seg fault
在visual studio里是general protection fault 反正不管怎么取名.它的意思就是说程序读了它不该读的内存.
正是因为在调试时内存是在虚拟内存里分配的.所以有一些segmentation fault不是很明显.原因是:
在VM里的内存分配有一个最小分配值.取名叫page. 在奔腾系统处理器里.这个值默认为4096 bytes.所以当你有一个程序占用了10000 bytes时.它总共会占用3个page.而不是2.5个.page已经是最小单位.不能再分割.
这就会出现一个问题.如果程序在多出来的page里出了错.很可能在调试时并不会报错.
本文出自 “” 博客,请务必保留此出处