假设我有这份文件:
[xiaobai@xiaobai done_read]$ cat my_bool.c
#include <stdio.h>
int
main() {
if (2 > -3) {
printf("true\n" );
}
else {
printf("false\n" );
}
}
[xiaobai@xiaobai done_read]$用gdb编译和调试:
[xiaobai@xiaobai done_read]$ gcc -g3 my_bool.c
[xiaobai@xiaobai done_read]$ gdb ./a.out
GNU gdb (GDB) Fedora 7.8.2-39.fc21
...
Reading symbols from ./a.out...done.
(gdb) b *main+1
+b *main+1
Breakpoint 1 at 0x400537: file my_bool.c, line 3.
(gdb) r
+r
Starting program: .../a.out
Breakpoint 1, 0x0000000000400537 in main () at my_bool.c:3
3 main() {
(gdb) s
+s
5 printf("true\n" );
(gdb) s
+s
_IO_puts (str=0x4005e0 "true") at ioputs.c:34
34 {
(gdb)它总是跳过if (2 > -3)的构造并进入printf("true\n" );
我想了解如果2> -3在二进制级别上c是如何表现的,它如何知道0x2大于0xfffffffffd,而0xfffffffd显然大于0x2。它可能是存储符号位还是其他什么的,但它需要检查系统中长的最大大小(0x7fffffffffffff)才能知道0xfffffffffd有签名位吗?
似乎gdb不可能这样做,那么如何在程序集/二进制级别调试这种逻辑表达式(if 2 > -3)呢?
下面的更新是我gcc的配置选项,安装在Fedora 21中。
[xiaobai@xiaobai note]$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.9.2/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.9.2-20150212/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.9.2-20150212/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.9.2 20150212 (Red Hat 4.9.2-6) (GCC)
[xiaobai@xiaobai note]$UPDATE2我更改了标题,因为gdb gcc是调试它的唯一方法。但是,了解2 > -3在gcc的折叠常数c或其他源文件中的表现并没有多大帮助。在这种特殊情况下,逻辑操作是如何执行/涉及的?gcc在执行逻辑操作前如何检测符号位?
发布于 2015-10-28 14:11:02
我认为实际的问题是“如果2> -3在二进制级别上,我想了解c是如何运行的”。要找到这一点,您可以观察编译器创建的机器代码。
根据20.html,下面的命令应该以人类可读的形式创建程序集代码
gcc -S foo.c要了解CPU如何在二进制级别处理每个程序集命令,请阅读CPU手册。
https://stackoverflow.com/questions/33367070
复制相似问题