c - Gdb 挂起断点无法解析
问题描述
我的系统是 Debian 64 位
我用c写了一个简单的hello world程序
2 #include <string.h>
3
4 int main() {
5 char str_a[20];
6
7 strcpy(str_a, "Hello, world!\n");
8 printf(str_a);
9 }
用它编译
gcc -g -o char_array2 char_array2.c
并通过gdb -q ./char_array2
现在,当我尝试像这样在 strcpy 设置断点时
(gdb) break strcpy
Function "strcpy" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (strcpy) pending.
(gdb)
并尝试运行它,断点未解决,打印出“Hello world”,程序终止。
按下运行后应该发生什么
Breakpoint 4, 0xb7f076f4 in strcpy () from /lib/tls/i686/cmov/libc.so.6
现在我在一本教授 32 位系统上的汇编的书中读到了这篇文章,并且路径显示 /i686/,所以我怀疑由于我使用 64 位处理器而缺少某种功能。我怎样才能解决这个问题?
解决方案
当我在 x686 上使用您的编译选项编译您的代码时,我得到以下信息:
leaq -32(%rbp), %rax
movabsq $8583909746840200520, %rdx
movq %rdx, (%rax)
movl $1684828783, 8(%rax)
movw $2593, 12(%rax)
movb $0, 14(%rax)
注意,没有调用strcpy
. 编译器已内联逻辑。随着-fno-builtin
,我得到这个:
leaq -32(%rbp), %rax
leaq .LC0(%rip), %rsi
movq %rax, %rdi
call strcpy@PLT
.loc 1 8 16
推荐阅读
- vuetify.js - 为什么没有为每个用户显示 v-select 组件?验证
- r - 标注地块组
- datetime - 为什么在 2010 年编译了这么多 PE 文件?
- node.js - MongoDB 中嵌套字段的文本搜索和文本索引
- jasmine - 如何使用 angular9 和 Jasmine 为所有组件生成 .pdf 格式的单元测试用例代码覆盖率报告
- css - 即使在 Web 浏览器中删除缓存和 cookie 后仍接收缓存的 CSS 样式
- spring-boot - Spring Boot 中用于 SSL TCP 通信的集成测试
- apache-beam - Apache Beam 的固定大小窗口
- reactjs - Redux 业务逻辑最佳实践
- amazon-web-services - 在 AWS Athena 中创建外部表时出错