Tag: gdb

在C中调试破坏的静态变量(gdb损坏?)

我已经完成了很多编程,但在C中并没有太多,我需要有关调试的建议。 我有一个静态变量(文件范围)在执行multithreading程序大约10-100秒后被破坏(在OS X 10.4上使用pthreads)。 我的代码看起来像这样: static float some_values[SIZE]; static int * addr; addr指向有效的内存地址一段时间,然后被一些值(有时为0,有时非零)破坏,从而在解除引用时导致段错误。 使用gdb我已经validation了addr正在人们期望的some_values之后立即在内存中进行some_values ,所以我的第一个猜测就是我使用了一个越界索引来写入some_values 。 但是,这是一个很小的文件,所以很容易检查这不是问题。 显而易见的调试技术是在变量addr上设置观察点。 但这样做似乎在gdb造成了不稳定和无法解释的行为。 观察点在第一次分配到addr时触发; 然后在我继续执行之后,我立即在另一个线程中得到一个无意义的段错误…据说是在程序的不同部分访问静态变量的地址时的段错误! 但是gdb允许我以交互方式读取和写入该内存地址。 程序收到信号EXC_BAD_ACCESS,无法访问内存。 原因:KERN_PROTECTION_FAILURE,地址:0x001d5bd0 在mainloop.c:39中接收(arg = 0x0)的0x0000678d 39 sample_buf_cleared ++; (gdb)p&sample_buf_cleared $ 17 =(int *)0x1d5bd0 (gdb)p sample_buf_cleared 18美元= 1 (gdb)设置sample_buf_cleared = 2 (GDB) gdb显然很困惑。 有谁知道为什么? 或者有没有人有任何建议调试此错误而不使用观察点?

C:分段错误:GDB:

我有一个函数shortestPath(),它是Dijkstra算法的修改实现,用于我正在为我的comp2类工作的棋盘游戏AI。 我已经浏览了网站并使用gdb和valgrind我确切知道了段错误发生的位置(几小时前就知道了),但无法弄清楚导致问题的是什么未定义的行为或逻辑错误。 发生问题的函数被调用大约10倍并按预期工作,直到它与GDB发生段错误:“错误读取变量:无法访问内存”和valgrind:“读取大小为8的无效” 通常情况下这就足够了,但我无法解决这个问题。 也欢迎任何一般建议和提示…谢谢! GDB: https : //gist.github.com/mckayryan/b8d1e9cdcc58dd1627ea Valgrind: https : //gist.github.com/mckayryan/8495963f6e62a51a734f 以下是发生段错误的function: static void processBuffer (GameView currentView, Link pQ, int *pQLen, LocationID *buffer, int bufferLen, Link prev, LocationID cur) { //printLinkIndex(“prev”, prev, NUM_MAP_LOCATIONS); // adds newly retrieved buffer Locations to queue adding link types appendLocationsToQueue(currentView, pQ, pQLen, buffer, bufferLen, cur); // calculates distance […]

GDB无法访问mmap()’d内核分配的内存?

我遇到了GDB和内核空间中分配的缓冲区问题。 缓冲区由内核模块分配,内核模块应该分配连续的内存块,然后通过mmap()调用将内存映射到用户空间。 但是,GDB似乎无法随时访问这些块。 例如,在GDB中遇到断点后: (gdb) x /10xb 0x4567e000 0x4567e000: Cannot access memory at address 0x4567e000 但是,在/ proc // smaps中查看应用程序当前映射的内存区域显示: 4567e000-456d3000 rwxs 8913f000 00:0d 883 /dev/cmem Size: 340 kB Rss: 340 kB Pss: 0 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 0 kB Referenced: 0 kB Swap: 0 kB 我甚至考虑这个的原因是因为在运行期间的某个时刻,这个缓冲区地址(或以类似方式分配的另一个)会导致SIGSEGV。 Program received […]

GDB调试器问题 – 没有命名的源文件

出于某种原因,我无法让gdb在调试时识别项目中的文件。 我尝试过各种各样的东西,包括下载不同的版本等等。我做的最后一件事就是用Twilight Dragon Media的Bundle Package完全覆盖了所有的MingW。 有谁知道如何解决这个问题? 奇怪的是,当我第一次使用它时,它工作正常,然后它突然停止工作。 我正在使用Code :: Blocks,我检查了-g项目的调试版本。 我在Windows Vista上运行。

gdb / lldb调用一个函数并中断它

我有一个长期计划的全局function: int test() { int a = 12; int c = 10; printf(“a=%d”,a); a += c ; printf(“a=%d”, a); return a; } 我调试程序并中断,然后发出以下命令: (lldb) call test() a=12a=22(int) $0 = 22 (lldb) 我希望它在我call test()之后每一行都在test()方法中断,而不是立即返回结果。 谁知道怎么做? ————————————以下答案———— ———————— @Jason Molenda的答案是正确的答案,使用expr -i0 — test()而不是call test() : (lldb) b test Breakpoint 1: 4 locations. (lldb) expr -i0 — test() […]

gcc是否在编译时重新排序局部变量?

我现在正在阅读(第二次)“黑客:剥削的艺术”并且偶然发现了一些事情。 本书提出了两种不同的方法来利用这两个类似的程序: auth_overflow和auth_overflow2 在第一个中,有一个像这样的密码检查function int check_authentication(char *password) { int auth_flag = 0; char password_buffer[16]; strcpy(password_buffer, password); … } 输入超过16个ASCII字符会将auth_flag的值更改为大于0的值,从而绕过检查,如此gdb输出所示: gdb$ x/12x $esp 0xbffff400: 0xffffffff 0x0000002f 0xb7e0fd24 0x41414141 0xbffff410: 0x41414141 0x41414141 0x41414141 0x00000001 0xbffff420: 0x00000002 0xbffff4f4 0xbffff448 0x08048556 password_buffer @ 0xbffff40c auth_flag @ 0xbffff41c 第二个程序反转了两个变量: int check_authentication(char *password) { char password_buffer[16]; int auth_flag = 0; strcpy(password_buffer, […]

gdb无法访问内存地址错误

这是我的disas代码: 0x0804844d : push %ebp 0x0804844e : mov %esp,%ebp 0x08048450 : and $0xfffffff0,%esp 0x08048453 : sub $0x20,%esp 0x08048456 : movl $0x8048540,(%esp) 0x0804845d : call 0x8048310 0x08048462 : lea 0x1c(%esp),%eax 0x08048466 : mov %eax,0x4(%esp) 0x0804846a : movl $0x8048555,(%esp) 0x08048471 : call 0x8048320 0x08048476 : mov 0x1c(%esp),%eax 0x0804847a : cmp $0x208c,%eax 0x0804847f : jne 0x804848f 0x08048481 : […]

如何在GNU C中使用mcheck进行堆一致性检查?

我试图了解堆一致性检查在GNU C库中的工作原理。 我指的是http://www.gnu.org/software/libc/manual/html_node/Heap-Consistency-Checking.html#Heap-Consistency-Checking 这是我编写的示例程序。 我按照手册中的建议,如果我在gdb中运行并调用mcheck(0)我将调用我的自定义abortfn 。 但它没有被召集。 我在这里想念的是什么? 包括必要的标题。 void *abortfn(enum mcheck_status status) { switch(status) { case MCHECK_DISABLED: printf(“MEMCHECK DISABLED\n”); break; default: printf(“MEMCHECK ENABLED\n”); } } int main() { printf(“This is mcheck testing code\n”); int *a = (int *) malloc(sizeof(int)); *a = 10; printf(“A: %d\n”, *a); free(a); return 0; }

当存在多个相同名称的类型时,在gdb中按名称指定正确的类型

我发现在检查变量时会得到两个不同的结果,这取决于我是否隐式或显式地使用类型GDB理解该变量为: 导航到我的堆栈框架 (gdb) frame 2 #2 0x00007f6a4277e87d in PyCheckFile (fname=0x7f6a338704b8 “/usr/lib/debug/sbin”, ctx=0x7f6a3803ddf8) at python-fd.c:2054 2054 pFunc = PyDict_GetItemString(p_ctx->pDict, “check_file”); /* Borrowed reference */ 打印p_ctx指向的内容,正如GDB所理解的那样,隐式使用GDB知道的类型。 (gdb) print *p_ctx $26 = {backup_level = 0, python_loaded = false, plugin_options = 0x0, module_path = 0x0, module_name = 0x0, fname = 0x0, link = 0x0, object_name = 0x0, object = […]

关闭GDB中设置断点的确认

在共享库上设置断点: (gdb) b file.c:278 No symbol table is loaded. Use the “file” command. Make breakpoint pending on future shared library load? (y or [n]) y 我可以让gdb不要问这个问题吗? (那就是,跳过确认?)