我正在从一本书中的一个例子开始工作,作者在书中编写了一个简短的、有缺陷的C程序来演示使用GDB进行调试。
#include <stdio.h>
int main (void)
{
const int data[5] = {1, 2, 3, 4, 5};
int i, sum;
for (i = 0; i >= 0; ++i)
sum += data[i];
printf ("sum = %i\n", sum);
return 0;
}
在使用gcc -g program.c编译之后,他运行gdb
我有以下C代码:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int value = 5;
char buffer_one[8], buffer_two[8];
strcpy(buffer_one, "one"); /* Put "one" into buffer_one. */
strcpy(buffer_two, "two"); /* Put "two" into buffer
我正在努力理解GDB和LLDB,以便我可以在任何时候有效地使用它来调试我的程序。
但是我好像被困住了--我不知道如何打印C库函数的输出,比如pow、strnlen等等。如果我想探索输出的话。
以下是LLDB和GDB的输出。
3 int main(int argc,char *argv[]) {
4 int a = pow(3,2);
-> 5 printf("the value of a is %d",a);
6 return 0;
7 }
(lldb) print pow(3,1)
warning:
我是否可以在库中声明一个全局变量,然后将其编译为共享对象?通过将其声明为extern,从其他库或主应用程序代码中引用它是否安全?
理论上它是可行的:
[niko@dev1 snippets]$ cat libcode.c
int variable; // <-- this is a global variable declared in a Library
void set_var(int value) {
variable=value;
}
int get_var(void) {
return variable;
}
[niko@dev1 snippets]$
我已经在VMware工作站上建立了Linux内核调试环境。但是,当我尝试连接正确的gdb时,我无法设置任何断点或检查任何内核符号。
目标机(debugee) Ubuntu 18:我已经用以下指令编译了linux内核5.0-0:
CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_INFO_REDUCED is not set
# CONFIG_DEBUG_INFO_SPLIT is not set
CONFIG_DEBUG_INFO_DWARF4=y
CONFIG_DEBUG_FS=y
# CONFIG_DEBUG_SECTION_MISMATCH is not set
#
是否可以使用GDB获取未使用的变量的值?有没有一些配置,让GCC没有使用的变量的垃圾值将显示出来,而不是‘优化出来’?
C文件:
#include<stdio.h>
void main()
{
int x;
int y;
printf("value of x: %d",x);
}
在gdb中,我想获取变量y的垃圾值。
(gdb) run
Starting program: /home/charmae/workspace/AVT/a.out
Breakpoint 1, main () at file4.c:7
7 print
在我的一些系统上,当我调试非常简单的代码时,GDB的行为与我预期的不同。在某些系统上,当我'step‘时,gdb“掩盖”了标准库调用;在其他系统上,'step’进入到每个库调用的机器语言中。
首先,一个我习惯于从GDB获得的行为的例子:
$ gdb ./testapp
GNU gdb (GDB) CentOS (7.0.1-45.el5.centos)
(...)
(gdb) break main
Breakpoint 1 at 0x80483b6: file testapp.c, line 6.
(gdb) run
Starting program: ./testapp
B
我遵循这份手册:
$ gdb ./test
(gdb) break main
(gdb) run
(gdb) compile code std::cout << "Hello world\n";
No compiler support for language c++.
(gdb) compile code print("hello world")
No compiler support for language c++.
这是否意味着不支持g++?或者我需要用某种特殊的方式配置GDB?
我是新来的扭转环境的人。我编写了下面的C代码,以帮助我更好地理解堆栈框架。
#include <stdio.h>
int sum(int a, int b,int c)
{
return(a+b+c);
}
int media(int a, int b,int c)
{
int total;
total = a + b + c;
return (total/3);
}
int main ()
{
int num1,num2,num3;
char keypress[1];
好吧,我只是不能让gdb工作,尽管尝试了相当多的解决方案。
我的makefile执行cc -g _________并生成myfilesys
>gdb myfilesys
(gdb) break my_linked_list.c:90
No symbol table is loaded, use the "file" command...
(gdb) file myfilesys
Reading symbols from /home/jsexton/Work/cs492/hw3/myfilesys...(no
debugging symbols found)...done
当在手机上以发布模式运行调试器时,我们的调试器出现了一个奇怪的错误。无论我们使用的是gdb还是lldb和Xcode4.3.3,代码都会落在断点上,即使代码的PC并没有真正指向断点。
伪代码示例:
if (true) {
// set breakpoint-A here
} else {
// set breakpoint-B here
}
//在这里设置另一个断点-C。
它将在断点B中着陆,然后跳转到断点A。
原因是因为我们处于“发布”模式,并且正在优化吗?
谢谢!
我不知道为什么在设置断点之后,GDB不能正常工作:
[jalal@mumble-36] (2)$ gdb --args ./server 200000 img
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are