- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在文件 delay.c
中有一个 C 程序:
void delay(int num)
{
volatile int i;
for(i=0; i
}
gcc -g -O1 -o delay.o delay.c
在 ARM 模拟器(更具体地说是 armel)上用 gcc 4.6.3 编译程序.组装在
delay.o
是:
00000000 :
0: e24dd008 sub sp, sp, #8
4: e3a03000 mov r3, #0
8: e58d3004 str r3, [sp, #4]
c: e59d3004 ldr r3, [sp, #4]
10: e1500003 cmp r0, r3
14: da000005 ble 30
18: e59d3004 ldr r3, [sp, #4]
1c: e2833001 add r3, r3, #1
20: e58d3004 str r3, [sp, #4]
24: e59d3004 ldr r3, [sp, #4]
28: e1530000 cmp r3, r0
2c: bafffff9 blt 18
30: e28dd008 add sp, sp, #8
34: e12fff1e bx lr
Tôi
在哪里位于函数堆栈
delay
上从调试信息。以下是关于
delay
的信息和
Tôi
hiện hữu
.debug_info
部分:
<1><25>: Abbrev Number: 2 (DW_TAG_subprogram)
<26> DW_AT_external : 1
<27> DW_AT_name : (indirect string, offset: 0x19): delay
<2b> DW_AT_decl_file : 1
<2c> DW_AT_decl_line : 1
<2d> DW_AT_prototyped : 1
<2e> DW_AT_low_pc : 0x0
<32> DW_AT_high_pc : 0x38
<36> DW_AT_frame_base : 0x0 (location list)
<3a> DW_AT_sibling : <0x59>
...
<2><4b>: Abbrev Number: 4 (DW_TAG_variable)
<4c> DW_AT_name : i
<4e> DW_AT_decl_file : 1
<4f> DW_AT_decl_line : 3
<50> DW_AT_type : <0x60>
<54> DW_AT_location : 0x20 (location list)
Tôi
的位置位于位置列表中。所以我输出位置列表:
Offset Begin End Expression
00000000 00000000 00000004 (DW_OP_breg13 (r13): 0)
00000000 00000004 00000038 (DW_OP_breg13 (r13): 8)
00000000
00000020 0000000c 00000020 (DW_OP_fbreg: -12)
00000020 00000024 00000028 (DW_OP_reg3 (r3))
00000020 00000028 00000038 (DW_OP_fbreg: -12)
00000020
delay
的框架基址应该是
r13 + 8
.所以从地址c到20,从地址28到38,
Tôi
的位置是
r13 + 8 -12 = r13 - 4
.
r13 - 4
Và
Tôi
显然在位置
r13 + 4
.
Tôi
的区别从调试信息计算和汇编计算之间的位置?
1 Câu trả lời
TL;博士 问题中的分析是正确的,差异是 gcc 组件之一中的错误(GNU Arm Embedded Toolchain 是一个明显的记录位置)。
目前,this other answer是不正确的,因为它错误地将计算位置表达式时的堆栈指针值与函数入口时堆栈指针的较早值混为一谈。
就矮人而言,Tôi
的位置因程序计数器而异。例如,考虑文本地址 delay+0x18
.此时,Tôi
的位置由 DW_OP_fbreg(-12)
给出,即帧基以下 12 个字节。框架基础由父项 DW_TAG_subprogram
提供的 DW_AT_frame_base
在这种情况下,属性也取决于程序计数器:对于 delay+0x18
它的表达式是 DW_OP_breg13(8)
,即 r13 + 8
.重要的是,此计算使用 当前 r13
的值,即 r13
的值当程序计数器等于 delay+0x18
.
因此,DWARF 断言,在 delay+0x18
, Tôi
nằm trong r13 + 8 - 12
,即现有堆栈底部以下 4 个字节。对组件的检查表明,在 delay+018
, Tôi
应该找到 4 个字节 以上 堆栈的底部。因此 DWARF 是错误的,无论生成什么都是有缺陷的。
可以使用 gdb
演示该错误在问题中提供的测试用例周围有一个简单的包装器:
$ cat delay.c
void delay(int num)
{
volatile int i;
for(i=0; i
}
$ gcc-4.6 -g -O1 -c delay.c
$ cat main.c
void delay(int);
int main(int argc, char **argv) {
delay(3);
}
$ gcc-4.6 -o test main.c delay.o
$ gdb ./test
.
.
.
(gdb)
delay+0x18
处设置断点并运行到第二次出现(我们预计
Tôi
为 1):
(gdb) break *delay+0x18
Breakpoint 1 at 0x103cc: file delay.c, line 4.
(gdb) run
Starting program: /home/pi/test
Breakpoint 1, 0x000103cc in delay (num=3) at delay.c:4
4 for(i=0; i
(gdb) cont
Continuing.
Breakpoint 1, 0x000103cc in delay (num=3) at delay.c:4
4 for(i=0; i
(gdb)
Tôi
是堆栈指针上方的四个字节。确实,它是:
(gdb) print *((int *)($r13 + 4))
$1 = 1
(gdb)
(gdb) print i
$2 = 0
(gdb)
Tôi
的位置。在堆栈指针下方的四个字节处。那里有一个零,因此报告的值为
Tôi
:
(gdb) print *((int *)($r13 - 4))
$3 = 0
(gdb)
gdb
时,写入堆栈指针下方这个虚假位置的魔数(Magic Number)再次出现。被要求打印
Tôi
:
(gdb) set *((int *)($r13 - 4)) = 42
(gdb) print i
$6 = 42
(gdb)
delay+0x18
,
DWARF 错误地编码了 Tôi
的位置如 r13 - 4
即使它的真实位置是 r13 + 4
.
DW_OP_fbreg(-12)
来更进一步。 (字节
0x91 0x74
)与
DW_OP_fbreg(-4)
(字节
0x91 0x7c
)。这给
$ readelf --debug-dump=loc delay.modified.o
Contents of the .debug_loc section:
Offset Begin End Expression
00000000 00000000 00000004 (DW_OP_breg13 (r13): 0)
0000000c 00000004 00000038 (DW_OP_breg13 (r13): 8)
00000018
00000020 0000000c 00000020 (DW_OP_fbreg: -4)
0000002c 00000024 00000028 (DW_OP_reg3 (r3))
00000037 00000028 00000038 (DW_OP_fbreg: -4)
00000043
$
delay+0x18
Tôi
的位置给出为
frame base - 4 = r13 + 8 - 4 = r13 + 4
, 匹配程序集。使用修正后的 DWARF 重复 gdb 实验显示预期值
Tôi
每次循环:
$ gcc-4.6 -o test.modified main.c delay.modified.o
$ gdb ./test.modified
.
.
.
(gdb) break *delay+0x18
Breakpoint 1 at 0x103cc: file delay.c, line 4.
(gdb) run
Starting program: /home/pi/test.modified
Breakpoint 1, 0x000103cc in delay (num=3) at delay.c:4
4 for(i=0; i
(gdb) print i
$1 = 0
(gdb) cont
Continuing.
Breakpoint 1, 0x000103cc in delay (num=3) at delay.c:4
4 for(i=0; i
(gdb) print i
$2 = 1
(gdb) cont
Continuing.
Breakpoint 1, 0x000103cc in delay (num=3) at delay.c:4
4 for(i=0; i
(gdb) print i
$3 = 2
(gdb) cont
Continuing.
[Inferior 1 (process 30954) exited with code 03]
(gdb)
关于debugging - ARM 中 DWARF 信息中的局部变量位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47359841/
Tôi cần đặt văn bản vào một Div, vào một Div khác, vào một Div khác nữa. Vậy thì trông nó như thế này: #document Thay đổi mã PIN
Một điều kỳ lạ đã xảy ra. Tôi có một mã HTML cơ bản. html, đầu, thân. (Vì tôi nhận được một số phiếu bầu không tốt, đây là mã đầy đủ) Đây là CSS của tôi: html { background
Tôi đang cố gắng tải một tập hợp hình ảnh từ Assets vào ImageView có trong UICollectionview nhưng bất cứ khi nào tôi chạy ứng dụng, nó đều hiển thị lỗi. Và cũng không có hình ảnh nào được hiển thị. Tôi đang sử dụng
Tôi cần thay đổi một số biến môi trường dựa trên đầu ra của tập lệnh perl có tham số. Trong tcsh, tôi có thể sử dụng lệnh bí danh để đánh giá đầu ra của một tập lệnh perl. tcsh: bí danh setsdk 'eval `/localhome/
Tôi đã tạo một ứng dụng Blazor (phía máy chủ) mới bằng Windows Authentication và chạy nó bằng IIS Express. Nó sẽ hiển thị thông báo "Xin chào Domain\User!" ở góc trên bên phải sau Ra
Đây là phương thức void login(Event event); của tôi. Tôi muốn biết cách thực hiện điều này trong Kotlin. Câu trả lời hay nhất Trong Kotlin, toán tử đại diện là *. Nó hướng dẫn trình biên dịch rằng nó không được biết đến, nhưng một khi nó được biết đến, không có lớp nào khác
Xem mã sau cho câu chuyện trong sách nếu story.title.length < 140 - var story
Tôi đang cố gắng học cách xử lý chuỗi trong C. Tôi đã viết một chương trình lưu trữ một số bản nhạc và giúp người dùng kiểm tra xem bài hát mà họ đang nghĩ đến có tồn tại trong số các bản nhạc đã lưu trữ hay không. Điều này được thực hiện bằng cách yêu cầu người dùng nhập một chuỗi ký tự. Chương trình sau đó sử dụng strstr()
Tôi đang học sscanf và thấy một chuỗi định dạng như thế này: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); Tôi hiểu phần %[^:] có nghĩa là quét cho đến khi gặp ':' và gán nó cho a. :
def char_check(x,y): nếu (str(x) trong y hoặc x.find(y) > -1) hoặc (str(y) trong x hoặc y.find(x) > -1):
Tôi có một tình huống muốn đưa các dòng hiện có từ một tệp văn bản vào một khối mới. dòng 1 dòng 2 dòng trong khối dòng 3 dòng 4 phải trở thành dòng 1 dòng 2 dòng
Tôi có một dự án mới và đang cố gắng thiết lập thanh công cụ gỡ lỗi Django. Đầu tiên, tôi thử thiết lập nhanh, chỉ cần thêm 'debug_toolbar' vào danh sách các ứng dụng đã cài đặt. Với điều này, khi tôi đi đến URL gốc của mình, gỡ lỗi
Trong Matlab, nếu tôi có một hàm f, với chữ ký f(a,b,c), tôi có thể tạo một hàm chỉ có một biến b sẽ gọi f với a=a1 và c=c1 cố định: g = @(b) f(a1, b,
Tôi không hiểu tại sao lại có khoảng cách dọc bổ sung giữa các phần tử trong ForEach bên trong VStack để hiển thị bộ chia ngang tùy chỉnh khi sử dụng GeometryReader bên trong ScrollView. Cuộn
Tôi tự hỏi, có hướng dẫn hoặc biện pháp tốt nhất nào về thời điểm sử dụng phiên và cookie không? Những gì nên và không nên lưu trữ trong đó? Cảm ơn! Câu trả lời hay nhất Các tài liệu này cung cấp hiểu biết tốt về các vấn đề bảo mật của cookie phiên và
Tôi có một ma trận Nx3 trong scipy/numpy mà tôi muốn tạo một biểu đồ thanh 3 chiều, trong đó trục X và Y được xác định bởi các giá trị ở cột thứ nhất và thứ hai của ma trận, chiều cao của mỗi thanh là cột thứ ba trong ma trận và số thanh được xác định bởi N.
Giả sử tôi khởi tạo semaphore theo hai cách khác nhau sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) Bây giờ, sem_wait(&randomsem) trong cả hai trường hợp
Tôi đang nghi ngờ cách giá trị được lưu trữ trong "WORD" vì PStr chứa đầu ra thực tế. ? Vì Pstr lưu trữ các chữ cái viết thường thành chữ hoa, làm sao để chuyển nó thành "WORD" trong printf? Có ai vui lòng giúp tôi được không? Bạn có thể giải thích được không? #bao gồm
Tôi có một mảng 3x3: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; và muốn lấy 2 phần tử đầu tiên
Tôi nhận ra bạn có thể dễ dàng kiểm tra tiêu điểm bằng cách sử dụng lệnh sau: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(window
Tôi là một lập trình viên xuất sắc, rất giỏi!