【1000个GDB技巧-008】-GDB如何设置类似shell变量方便后面程序访问?set $my_val=0x123

本文详细讨论了在GDB调试中使用.gdbinit文件和VSCodelaunch.json的技巧,涉及变量设置、脚本管理及不同环境下的使用方法。

可以使用脚本的几个场景:

  1. 在gdb的命令行中
  2. .gdbinit文件中,gdb初始化使用
  3. xxx.gdb脚本中
  4. vscode的launch.json的configurations的cppdbg的setupCommands某一个启动命令的text中,类似.gdbinit(不需要加-exec)设置后在调试窗口可以任意取用

设置命令

set $my_val=0x123

使用命令

p $my_val

与shell的不同

shell设置变量不用加$

技巧

  • vscode的launch.json中定义,窗口使用,这样可以开闭修改
  • xxx.gdb脚本中定义其他脚本使用可以开闭
  • xxx.gdb脚本中定义,命令行使用(使用前需要 source xxx.gdb先初始化,类似shell的source)
#include "ti_msp_dl_config.h" #include "tjc_usart_hmi.h" #include <stdio.h> #include <stdint.h> #include <stdbool.h> #include <string.h> // 添加memset头文件 #include <ti/driverlib/dl_uart.h> #include <ti/devices/msp/msp.h> #include <ti/driverlib/driverlib.h> #include <ti/driverlib/dl_common.h> // 红外协议时序宏 (单位:微秒) #define LEADER_HIGH 9000 // 引导码高电平9ms #define LEADER_LOW 4500 // 引导码低电平4.5ms #define BIT_HIGH 560 // 数据位高电平560μs #define BIT_ONE_LOW 1690 // 逻辑"1"低电平1690μs #define BIT_ZERO_LOW 560 // 逻辑"0"低电平560μs #define TOLERANCE 150 // 时序容差±150μs #define SYSTEM_CLOCK 32000000 //// 32MHz // 安全参数 #define MAX_RETRY 3 // 最大重试次数 #define LOCK_TIME 15000 // 锁定时间(ms) #define TIME_WINDOW 3000 // 时间容错窗口(±3000ms) // 淘晶驰屏定义 #define TJC_PAGE_MAIN 0 #define TJC_TEXT_STATUS "t0" #define TJC_TEXT_TIME "t1" #define TJC_BUTTON_RESET "b0" #define FRAME_LENGTH 7 #define CONFIG_UART_0_BAUDRATE 115200 // 必须与屏幕波特率一致 // 全局变量结构体 - 使用默认内存分配 typedef struct { volatile uint32_t delay_value; volatile uint8_t retry_count; volatile uint32_t last_fail_time; volatile uint32_t rtc_counter; volatile uint32_t now_time; volatile uint32_t display_last_time; // 显示相关变量 volatile uint32_t display_counter; } GlobalVars; volatile GlobalVars globals; // 使用普通全局变量 volatile uint32_t delay_times = 0; volatile uint8_t uart_data = 0; volatile uint32_t now_time = 0; /******************** 淘晶驰串口屏驱动 ********************/ void tjc_send_cmd(const char *cmd) { // 发送命令主体 const char *p = cmd; while(*p) { while(!DL_UART_isTXFIFOEmpty(UART_0_INST)); // 等待发送完成 DL_UART_transmitData(UART_0_INST, *p++); } // 发送TJC协议结束符(0xFF 0xFF 0xFF) for(uint8_t i = 0; i < 3; i++) { while(!DL_UART_isTXFIFOEmpty(UART_0_INST)); DL_UART_transmitData(UART_0_INST, 0xFF); } } void tjc_set_text(const char *obj_name, const char *text) { char cmd[128]; snprintf(cmd, sizeof(cmd), "%s.txt=\"%s\"", obj_name, text); tjc_send_cmd(cmd); } void tjc_change_page(uint8_t page_id) { char cmd[16]; snprintf(cmd, sizeof(cmd), "page %d", page_id); tjc_send_cmd(cmd); } void tjc_beep(uint16_t duration_ms) { char cmd[16]; snprintf(cmd, sizeof(cmd), "beep %u", duration_ms); tjc_send_cmd(cmd); } /******************** 系统基础功能 ********************/ void delay_us(uint32_t us) { globals.delay_value = us; while(globals.delay_value != 0); } void SysTick_Handler(void) { if(globals.delay_value > 0) globals.delay_value--; globals.rtc_counter++; // 简单的RTC计数器(每毫秒增加1) globals.now_time = globals.rtc_counter; // 更新全局时间 } uint32_t get_timestamp(void) { return globals.rtc_counter; } /******************** 红外解码功能(8位) ********************/ bool validate_dynamic_code(uint8_t rx_code) { uint32_t current_seed = get_timestamp(); for(int offset = -TIME_WINDOW; offset <= TIME_WINDOW; offset++) { uint32_t seed = current_seed + offset; uint32_t calc_code = (seed * 0x5DEECE66D) & 0xFFFFFFFF; // 比较低8位 if(rx_code == (calc_code & 0xFF)) return true; } return false; } uint8_t ir_receive_packet(void) { uint8_t data = 0; uint32_t start_time = 0; uint32_t duration = 0; // 1. 检测引导码 while(DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_9) == 1); // 等待高电平结束 start_time = get_timestamp(); while(DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_9) == 0); // 等待低电平结束 duration = get_timestamp() - start_time; // 检查引导码低电平部分是否符合要求(转换为毫秒) if(duration < (LEADER_HIGH/1000 - TOLERANCE/1000) || duration > (LEADER_HIGH/1000 + TOLERANCE/1000)) return 0xFF; // 2. 检测引导码高电平部分 start_time = get_timestamp(); while(DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_9) == 1); duration = get_timestamp() - start_time; if(duration < (LEADER_LOW/1000 - TOLERANCE/1000) || duration > (LEADER_LOW/1000 + TOLERANCE/1000)) return 0xFF; // 3. 接收8位数据 for(int i = 0; i < 8; i++) { start_time = get_timestamp(); while(DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_9) == 0); duration = get_timestamp() - start_time; // 检查数据位高电平部分 if(duration < (BIT_HIGH/1000 - TOLERANCE/1000) || duration > (BIT_HIGH/1000 + TOLERANCE/1000)) return 0xFF; start_time = get_timestamp(); while(DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_9) == 1); duration = get_timestamp() - start_time; // 判断逻辑位 if(duration >= (BIT_ONE_LOW/1000 - TOLERANCE/1000) && duration <= (BIT_ONE_LOW/1000 + TOLERANCE/1000)) { data |= (1 << (7 - i)); // 设置逻辑"1" } else if(duration >= (BIT_ZERO_LOW/1000 - TOLERANCE/1000) && duration <= (BIT_ZERO_LOW/1000 + TOLERANCE/1000)) { // 逻辑"0"不需要设置,默认为0 } else { return 0xFF; // 无效时序 } } return data; } /******************** 系统初始化 ********************/ void init_system(void) { // 初始化全局变量 memset((void*)&globals, 0, sizeof(GlobalVars)); // 添加SysTick初始化(1ms中断) DL_SYSTICK_config(32000); DL_SYSTICK_enableInterrupt(); // 添加这行 // 设置SysTick中断优先级 NVIC_SetPriority(SysTick_IRQn, 3); DL_GPIO_initDigitalInput(DL_GPIO_PIN_9); // 启用全局中断 __enable_irq(); // 初始化串口屏 // 增强版初始化序列 delay_us(1000000); // 等待1秒 // 软重启屏幕 tjc_send_cmd("rest"); delay_us(1500000); // 等待1.5秒 tjc_set_text(TJC_TEXT_STATUS, "等待红外信号"); tjc_set_text(TJC_TEXT_TIME, "系统启动完成"); } /******************** 主业务逻辑 ********************/ void security_fsm(void) { // 1. 检测锁定状态 if(globals.retry_count >= MAX_RETRY) { if(get_timestamp() - globals.last_fail_time < LOCK_TIME) { tjc_set_text(TJC_TEXT_STATUS, "锁定中,请稍候"); return; } globals.retry_count = 0; } // 2. 尝试接收数据包 uint8_t rx_code = ir_receive_packet(); if(rx_code == 0xFF) { tjc_set_text(TJC_TEXT_STATUS, "信号接收失败"); tjc_beep(200); return; } // 3. 动态解码验证 if(validate_dynamic_code(rx_code)) { tjc_set_text(TJC_TEXT_STATUS, "认证成功"); tjc_beep(100); delay_us(50000); // 50ms延迟 tjc_beep(100); globals.retry_count = 0; } else { char msg[30]; snprintf(msg, sizeof(msg), "失败(剩余%d次)", MAX_RETRY - globals.retry_count - 1); tjc_set_text(TJC_TEXT_STATUS, msg); tjc_beep(500); globals.retry_count++; globals.last_fail_time = get_timestamp(); } } // 搭配滴答定时器实现的精确ms延时 void delay_ms(unsigned int ms) { delay_times = ms; while (delay_times != 0) ; } /******************** 主函数 ********************/ int main(void) { SYSCFG_DL_init(); // 初始化系统 init_system(); // 清除中断标志 NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN); // 使能串口中断 NVIC_EnableIRQ(UART_0_INST_INT_IRQN); SYSCFG_DL_init(); // 初始化显示变量 globals.display_last_time = globals.now_time; globals.display_counter = 0; uint8_t recv; recv= ir_receive_packet(); while(1) { // 每秒更新显示 if(globals.now_time - globals.display_last_time >= 1000) { globals.display_last_time = globals.now_time; globals.display_counter++; char str[50]; snprintf(str, sizeof(str), "t1.txt=\"运行:%d秒\"", globals.display_counter); tjc_send_cmd(str); } // 红外信号检测 security_fsm(); // 低功耗等待 __WFI(); } } Memory map prevented reading 0x20208040这个问题怎么办
07-07
#include "ti_msp_dl_config.h" #include "tjc_usart_hmi.h" #include <stdio.h> #include <stdint.h> #include <stdbool.h> #include <string.h> // 添加memset头文件 #include <ti/driverlib/dl_uart.h> #include <ti/devices/msp/msp.h> #include <ti/driverlib/driverlib.h> #include <ti/driverlib/dl_common.h> // 红外协议时序宏 (单位:微秒) #define LEADER_HIGH 9000 // 引导码高电平9ms #define LEADER_LOW 4500 // 引导码低电平4.5ms #define BIT_HIGH 560 // 数据位高电平560μs #define BIT_ONE_LOW 1690 // 逻辑"1"低电平1690μs #define BIT_ZERO_LOW 560 // 逻辑"0"低电平560μs #define TOLERANCE 150 // 时序容差±150μs #define SYSTEM_CLOCK 32000000 //// 32MHz // 安全参数 #define MAX_RETRY 3 // 最大重试次数 #define LOCK_TIME 15000 // 锁定时间(ms) #define TIME_WINDOW 3000 // 时间容错窗口(±3000ms) // 淘晶驰屏定义 #define TJC_PAGE_MAIN 0 #define TJC_TEXT_STATUS "t0" #define TJC_TEXT_TIME "t1" #define TJC_BUTTON_RESET "b0" #define FRAME_LENGTH 7 #define CONFIG_UART_0_BAUDRATE 115200 // 必须与屏幕波特率一致 #define MT_DEVICE 0x0 // 设备内存 #define MT_NORMAL 0x1 // 普通内存 #define MT_RO (0 << 2) // 只读 #define MT_RW (1 << 2) // 读写 #define PHYS_ADDR 0x10208040 // 假设的物理地址 #define VIRT_ADDR 0x20208040 // 目标虚拟地址 // 全局变量结构体 - 使用默认内存分配 typedef struct { volatile uint32_t delay_value; volatile uint8_t retry_count; volatile uint32_t last_fail_time; volatile uint32_t rtc_counter; volatile uint32_t now_time; volatile uint32_t display_last_time; // 显示相关变量 volatile uint32_t display_counter; } GlobalVars; volatile GlobalVars globals; // 使用普通全局变量 volatile uint32_t delay_times = 0; volatile uint8_t uart_data = 0; volatile uint32_t now_time = 0; void create_mapping(void) { // 创建1MB的映射区域 create_section_mapping(VIRT_ADDR, PHYS_ADDR, MT_DEVICE | MT_RW | MT_SECURE); } /******************** 淘晶驰串口屏驱动 ********************/ void tjc_send_cmd(const char *cmd) { // 发送命令主体 const char *p = cmd; while(*p) { while(!DL_UART_isTXFIFOEmpty(UART_0_INST)); // 等待发送完成 DL_UART_transmitData(UART_0_INST, *p++); } // 发送TJC协议结束符(0xFF 0xFF 0xFF) for(uint8_t i = 0; i < 3; i++) { while(!DL_UART_isTXFIFOEmpty(UART_0_INST)); DL_UART_transmitData(UART_0_INST, 0xFF); } } void tjc_set_text(const char *obj_name, const char *text) { char cmd[128]; snprintf(cmd, sizeof(cmd), "%s.txt=\"%s\"", obj_name, text); tjc_send_cmd(cmd); } void tjc_change_page(uint8_t page_id) { char cmd[16]; snprintf(cmd, sizeof(cmd), "page %d", page_id); tjc_send_cmd(cmd); } void tjc_beep(uint16_t duration_ms) { char cmd[16]; snprintf(cmd, sizeof(cmd), "beep %u", duration_ms); tjc_send_cmd(cmd); } /******************** 系统基础功能 ********************/ void delay_us(uint32_t us) { globals.delay_value = us; while(globals.delay_value != 0); } void SysTick_Handler(void) { if(globals.delay_value > 0) globals.delay_value--; globals.rtc_counter++; // 简单的RTC计数器(每毫秒增加1) globals.now_time = globals.rtc_counter; // 更新全局时间 } uint32_t get_timestamp(void) { return globals.rtc_counter; } /******************** 红外解码功能(8位) ********************/ bool validate_dynamic_code(uint8_t rx_code) { uint32_t current_seed = get_timestamp(); for(int offset = -TIME_WINDOW; offset <= TIME_WINDOW; offset++) { uint32_t seed = current_seed + offset; uint32_t calc_code = (seed * 0x5DEECE66D) & 0xFFFFFFFF; // 比较低8位 if(rx_code == (calc_code & 0xFF)) return true; } return false; } uint8_t ir_receive_packet(void) { uint8_t data = 0; uint32_t start_time = 0; uint32_t duration = 0; // 1. 检测引导码 while(DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_9) == 1); // 等待高电平结束 start_time = get_timestamp(); while(DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_9) == 0); // 等待低电平结束 duration = get_timestamp() - start_time; // 检查引导码低电平部分是否符合要求(转换为毫秒) if(duration < (LEADER_HIGH/1000 - TOLERANCE/1000) || duration > (LEADER_HIGH/1000 + TOLERANCE/1000)) return 0xFF; // 2. 检测引导码高电平部分 start_time = get_timestamp(); while(DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_9) == 1); duration = get_timestamp() - start_time; if(duration < (LEADER_LOW/1000 - TOLERANCE/1000) || duration > (LEADER_LOW/1000 + TOLERANCE/1000)) return 0xFF; // 3. 接收8位数据 for(int i = 0; i < 8; i++) { start_time = get_timestamp(); while(DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_9) == 0); duration = get_timestamp() - start_time; // 检查数据位高电平部分 if(duration < (BIT_HIGH/1000 - TOLERANCE/1000) || duration > (BIT_HIGH/1000 + TOLERANCE/1000)) return 0xFF; start_time = get_timestamp(); while(DL_GPIO_readPins(GPIOA, DL_GPIO_PIN_9) == 1); duration = get_timestamp() - start_time; // 判断逻辑位 if(duration >= (BIT_ONE_LOW/1000 - TOLERANCE/1000) && duration <= (BIT_ONE_LOW/1000 + TOLERANCE/1000)) { data |= (1 << (7 - i)); // 设置逻辑"1" } else if(duration >= (BIT_ZERO_LOW/1000 - TOLERANCE/1000) && duration <= (BIT_ZERO_LOW/1000 + TOLERANCE/1000)) { // 逻辑"0"不需要设置,默认为0 } else { return 0xFF; // 无效时序 } } return data; } /******************** 系统初始化 ********************/ void init_system(void) { // 初始化全局变量 memset((void*)&globals, 0, sizeof(GlobalVars)); // 添加SysTick初始化(1ms中断) DL_SYSTICK_config(32000); DL_SYSTICK_enableInterrupt(); // 添加这行 // 设置SysTick中断优先级 NVIC_SetPriority(SysTick_IRQn, 3); DL_GPIO_initDigitalInput(DL_GPIO_PIN_9); // 启用全局中断 __enable_irq(); // 初始化串口屏 // 增强版初始化序列 delay_us(1000000); // 等待1秒 // 软重启屏幕 tjc_send_cmd("rest"); delay_us(1500000); // 等待1.5秒 tjc_set_text(TJC_TEXT_STATUS, "等待红外信号"); tjc_set_text(TJC_TEXT_TIME, "系统启动完成"); } /******************** 主业务逻辑 ********************/ void security_fsm(void) { // 1. 检测锁定状态 if(globals.retry_count >= MAX_RETRY) { if(get_timestamp() - globals.last_fail_time < LOCK_TIME) { tjc_set_text(TJC_TEXT_STATUS, "锁定中,请稍候"); return; } globals.retry_count = 0; } // 2. 尝试接收数据包 uint8_t rx_code = ir_receive_packet(); if(rx_code == 0xFF) { tjc_set_text(TJC_TEXT_STATUS, "信号接收失败"); tjc_beep(200); return; } // 3. 动态解码验证 if(validate_dynamic_code(rx_code)) { tjc_set_text(TJC_TEXT_STATUS, "认证成功"); tjc_beep(100); delay_us(50000); // 50ms延迟 tjc_beep(100); globals.retry_count = 0; } else { char msg[30]; snprintf(msg, sizeof(msg), "失败(剩余%d次)", MAX_RETRY - globals.retry_count - 1); tjc_set_text(TJC_TEXT_STATUS, msg); tjc_beep(500); globals.retry_count++; globals.last_fail_time = get_timestamp(); } } // 搭配滴答定时器实现的精确ms延时 void delay_ms(unsigned int ms) { delay_times = ms; while (delay_times != 0) ; } /******************** 主函数 ********************/ int main(void) { SYSCFG_DL_init(); // 初始化系统 init_system(); // 清除中断标志 NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN); // 使能串口中断 NVIC_EnableIRQ(UART_0_INST_INT_IRQN); SYSCFG_DL_init(); // 初始化显示变量 globals.display_last_time = globals.now_time; globals.display_counter = 0; uint8_t recv; recv= ir_receive_packet(); while(1) { // 每秒更新显示 if(globals.now_time - globals.display_last_time >= 1000) { globals.display_last_time = globals.now_time; globals.display_counter++; char str[50]; snprintf(str, sizeof(str), "t1.txt=\"运行:%d秒\"", globals.display_counter); tjc_send_cmd(str); } // 红外信号检测 security_fsm(); // 低功耗等待 __WFI(); } } 应该怎么改
07-07
基于下面代码,如果不能定义自己的surface id,能否获取waylandsink 自动生成的surface id,来完成下面程序(注意:GStreamer 1.20.7) #include <gst/gst.h> #include <gst/video/videooverlay.h> #include <locale.h> #include <stdio.h> #include <stdlib.h> #include <libgen.h> #include <unistd.h> #include <string.h> #include <sys/wait.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <sys/mman.h> #include <wayland-client.h> #include <wayland-util.h> #include <glib.h> #include <glib-object.h> #include <ilm/ivi-application-client-protocol.h> // -------------------------- wl_display 的 boxed 类型定义 -------------------------- static gpointer wl_display_boxed_copy(const gpointer src) { return (gpointer)src; // 仅传递指针引用 } static void wl_display_boxed_free(gpointer data) { // 空实现:由 Wayland 库管理释放 } GType wl_display_get_type(void) { static GType type = 0; if (G_UNLIKELY(type == 0)) { type = g_boxed_type_register_static( "WlDisplay", wl_display_boxed_copy, wl_display_boxed_free ); } return type; } #define WL_TYPE_DISPLAY (wl_display_get_type()) // GStreamer Wayland 上下文常量 #define GST_CONTEXT_TYPE_WAYLAND_DISPLAY "wayland-display" // -------------------------- 配置常量 -------------------------- #define LAYER_ID 300 #define SCREEN_ID 0 #define SCREEN_WIDTH 1920 #define SCREEN_HEIGHT 720 #define SURFACE_WAIT_US 1000000 #define RENDER_DELAY_US 500000 #define IVI_SURFACE_ID 2000100 #define IVI_WAYLAND_VERSION 4 #define DUMMY_BUFFER_SIZE 4 // -------------------------- 全局变量 -------------------------- static struct wl_display *wl_display = NULL; static struct wl_registry *wl_registry = NULL; static struct wl_compositor *wl_compositor = NULL; static struct wl_shm *wl_shm = NULL; static struct ivi_application *ivi_app = NULL; static struct ivi_surface *ivi_surface = NULL; static struct wl_surface *wayland_surface = NULL; static struct wl_buffer *dummy_buffer = NULL; static guint32 videosink_surface_id = 0; static gboolean layer_initialized = FALSE; // -------------------------- Wayland 注册回调 -------------------------- static void registry_handle_global(void *data, struct wl_registry *registry, uint32_t name, const char *interface, uint32_t version) { if (strcmp(interface, "wl_compositor") == 0) { if (version < IVI_WAYLAND_VERSION) { fprintf(stderr, "Warning: wl_compositor version %u < %u\n", version, IVI_WAYLAND_VERSION); } wl_compositor = wl_registry_bind(registry, name, &wl_compositor_interface, IVI_WAYLAND_VERSION); printf("Debug: Bound wl_compositor (name: %u)\n", name); } else if (strcmp(interface, "ivi_application") == 0) { ivi_app = wl_registry_bind(registry, name, &ivi_application_interface, 1); printf("Debug: Bound ivi_application (name: %u)\n", name); } else if (strcmp(interface, "wl_shm") == 0) { wl_shm = wl_registry_bind(registry, name, &wl_shm_interface, 1); printf("Debug: Bound wl_shm (name: %u)\n", name); } } static const struct wl_registry_listener registry_listener = { .global = registry_handle_global, }; // -------------------------- 创建 dummy buffer -------------------------- static struct wl_buffer* create_valid_dummy_buffer() { if (!wl_shm) { fprintf(stderr, "Error: wl_shm not bound (cannot create buffer)\n"); return NULL; } char shm_name[32]; snprintf(shm_name, sizeof(shm_name), "/wl_shm_dummy_%d", getpid()); int fd = shm_open(shm_name, O_CREAT | O_RDWR, 0600); if (fd < 0) { fprintf(stderr, "Error: shm_open failed (errno: %d)\n", errno); return NULL; } shm_unlink(shm_name); if (ftruncate(fd, DUMMY_BUFFER_SIZE) < 0) { fprintf(stderr, "Error: ftruncate failed (errno: %d)\n", errno); close(fd); return NULL; } void *data = mmap(NULL, DUMMY_BUFFER_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (data == MAP_FAILED) { fprintf(stderr, "Error: mmap failed (errno: %d)\n", errno); close(fd); return NULL; } memset(data, 0, DUMMY_BUFFER_SIZE); struct wl_shm_pool *pool = wl_shm_create_pool(wl_shm, fd, DUMMY_BUFFER_SIZE); if (!pool) { fprintf(stderr, "Error: wl_shm_create_pool failed\n"); munmap(data, DUMMY_BUFFER_SIZE); close(fd); return NULL; } struct wl_buffer *buffer = wl_shm_pool_create_buffer( pool, 0, 1, 1, 4, WL_SHM_FORMAT_ARGB8888 ); wl_shm_pool_destroy(pool); munmap(data, DUMMY_BUFFER_SIZE); close(fd); if (!buffer) { fprintf(stderr, "Error: Failed to create wl_buffer\n"); return NULL; } printf("Debug: Created valid wl_buffer (ptr: %p)\n", buffer); return buffer; } // -------------------------- 路径拼接工具 -------------------------- char* safe_path_join(const char *dir, const char *file) { if (!dir || !file) return NULL; size_t dir_len = strlen(dir); size_t file_len = strlen(file); char *result = malloc(dir_len + file_len + 2); if (!result) return NULL; sprintf(result, "%s%s%s", dir, (dir_len > 0 && dir[dir_len-1] != '/') ? "/" : "", file); return result; } // -------------------------- 执行 LayerManager 命令 -------------------------- gboolean exec_layermanager_cmd(const char *cmd, const char *error_msg) { printf("Executing LayerManager command: %s\n", cmd); int ret = system(cmd); if (ret != 0) { fprintf(stderr, "Error: %s (return code: %d)\n", error_msg, WEXITSTATUS(ret)); return FALSE; } return TRUE; } // -------------------------- 检查 Surface 是否存在 -------------------------- gboolean check_surface_exist(guint32 surface_id) { char cmd[256]; char buf[1024] = {0}; FILE *fp = NULL; snprintf(cmd, sizeof(cmd), "LayerManagerControl get surfaces | grep 'Surface %u'", surface_id); fp = popen(cmd, "r"); if (!fp) { fprintf(stderr, "Error: Failed to check surface existence\n"); return FALSE; } gboolean exist = (fgets(buf, sizeof(buf), fp) != NULL); if (exist) { printf("Debug: IVI Surface %u confirmed\n", surface_id); } else { fprintf(stderr, "Debug: IVI Surface %u not found\n", surface_id); } pclose(fp); return exist; } // -------------------------- 配置图层和 Surface 绑定 -------------------------- gboolean setup_layer_and_surface(guint32 surface_id) { if (surface_id == 0) { fprintf(stderr, "Error: Invalid IVI Surface ID (0)\n"); return FALSE; } int retry = 3; while (retry-- > 0 && !check_surface_exist(surface_id)) { fprintf(stderr, "Retry: Waiting for IVI Surface %u (retry %d/3)...\n", surface_id, 3 - retry); usleep(SURFACE_WAIT_US / 3); } if (!check_surface_exist(surface_id)) { fprintf(stderr, "Error: IVI Surface %u does not exist\n", surface_id); return FALSE; } char cmd[512]; printf("Waiting %dms for IVI Surface stabilization...\n", SURFACE_WAIT_US / 1000); usleep(SURFACE_WAIT_US); snprintf(cmd, sizeof(cmd), "LayerManagerControl create layer %d %d %d", LAYER_ID, SCREEN_WIDTH, SCREEN_HEIGHT); if (!exec_layermanager_cmd(cmd, "Failed to create layer")) return FALSE; snprintf(cmd, sizeof(cmd), "LayerManagerControl add surface %u to layer %d", surface_id, LAYER_ID); if (!exec_layermanager_cmd(cmd, "Failed to bind IVI Surface to layer")) { snprintf(cmd, sizeof(cmd), "LayerManagerControl destroy layer %d", LAYER_ID); exec_layermanager_cmd(cmd, "Cleanup: Failed to destroy layer"); return FALSE; } snprintf(cmd, sizeof(cmd), "LayerManagerControl set layer %d destination region 0 0 %d %d", LAYER_ID, SCREEN_WIDTH, SCREEN_HEIGHT); if (!exec_layermanager_cmd(cmd, "Failed to set layer destination")) goto cleanup; snprintf(cmd, sizeof(cmd), "LayerManagerControl set surface %u destination region 0 0 %d %d", surface_id, SCREEN_WIDTH, SCREEN_HEIGHT); if (!exec_layermanager_cmd(cmd, "Failed to set IVI Surface destination")) goto cleanup; snprintf(cmd, sizeof(cmd), "LayerManagerControl set layer %d visibility 1", LAYER_ID); if (!exec_layermanager_cmd(cmd, "Failed to enable layer visibility")) goto cleanup; snprintf(cmd, sizeof(cmd), "LayerManagerControl set surface %u visibility 1", surface_id); if (!exec_layermanager_cmd(cmd, "Failed to enable IVI Surface visibility")) goto cleanup; printf("Waiting %dms for rendering pipeline init...\n", RENDER_DELAY_US / 1000); usleep(RENDER_DELAY_US); snprintf(cmd, sizeof(cmd), "LayerManagerControl set screen %d render order %d", SCREEN_ID, LAYER_ID); if (!exec_layermanager_cmd(cmd, "Failed to set render order")) goto cleanup; layer_initialized = TRUE; printf("Layer setup completed (IVI Surface ID: %u, Layer ID: %d)\n", surface_id, LAYER_ID); return TRUE; cleanup: snprintf(cmd, sizeof(cmd), "LayerManagerControl destroy layer %d", LAYER_ID); exec_layermanager_cmd(cmd, "Cleanup: Failed to destroy layer (ignored)"); return FALSE; } // -------------------------- 清理图层和 Surface -------------------------- void cleanup_layer_and_surface(void) { if (!layer_initialized || videosink_surface_id == 0) return; char cmd[512]; snprintf(cmd, sizeof(cmd), "LayerManagerControl set surface %u visibility 0", videosink_surface_id); exec_layermanager_cmd(cmd, "Cleanup: Failed to disable IVI Surface visibility (ignored)"); snprintf(cmd, sizeof(cmd), "LayerManagerControl destroy layer %d", LAYER_ID); exec_layermanager_cmd(cmd, "Cleanup: Failed to destroy layer (ignored)"); if (dummy_buffer) { wl_buffer_destroy(dummy_buffer); dummy_buffer = NULL; printf("Debug: Destroyed dummy buffer\n"); } if (ivi_surface) { ivi_surface_destroy(ivi_surface); ivi_surface = NULL; } if (wayland_surface) { wl_surface_destroy(wayland_surface); wayland_surface = NULL; } layer_initialized = FALSE; videosink_surface_id = 0; } // -------------------------- 检查 LayerManagerControl -------------------------- gboolean check_layermanager(void) { if (system("LayerManagerControl --help > /dev/null 2>&1") != 0) { fprintf(stderr, "Error: 'LayerManagerControl' not found\n"); return FALSE; } printf("LayerManagerControl tool validated\n"); return TRUE; } // -------------------------- 创建 IVI Surface -------------------------- gboolean create_ivi_valid_surface(void) { if (!wl_compositor || !ivi_app || !wl_shm) { fprintf(stderr, "Error: Missing required Wayland interfaces\n"); return FALSE; } wayland_surface = wl_compositor_create_surface(wl_compositor); if (!wayland_surface) { fprintf(stderr, "Error: Failed to create base wl_surface\n"); return FALSE; } printf("Debug: Created base wl_surface (ptr: %p)\n", wayland_surface); dummy_buffer = create_valid_dummy_buffer(); if (!dummy_buffer) { fprintf(stderr, "Error: Failed to create valid dummy buffer\n"); wl_surface_destroy(wayland_surface); wayland_surface = NULL; return FALSE; } wl_surface_attach(wayland_surface, dummy_buffer, 0, 0); printf("Debug: Attached valid wl_buffer to wl_surface (ptr: %p)\n", dummy_buffer); wl_surface_damage_buffer(wayland_surface, 0, 0, 1, 1); wl_surface_commit(wayland_surface); int roundtrip_result = wl_display_roundtrip(wl_display); if (roundtrip_result < 0) { fprintf(stderr, "Warning: wl_display_roundtrip failed after 1st commit\n"); } else { printf("Debug: 1st commit with valid buffer (compositor accepted)\n"); } ivi_surface = ivi_application_surface_create(ivi_app, IVI_SURFACE_ID, wayland_surface); if (!ivi_surface) { fprintf(stderr, "Error: Failed to create ivi_surface\n"); wl_surface_destroy(wayland_surface); wayland_surface = NULL; wl_buffer_destroy(dummy_buffer); dummy_buffer = NULL; return FALSE; } printf("Debug: Created ivi_surface with ID %u (ptr: %p)\n", IVI_SURFACE_ID, ivi_surface); videosink_surface_id = IVI_SURFACE_ID; printf("Debug: Fixed IVI Surface ID to %u\n", videosink_surface_id); wl_surface_commit(wayland_surface); wl_display_roundtrip(wl_display); printf("Debug: 2nd commit to confirm IVI association\n"); if (check_surface_exist(videosink_surface_id)) { printf("Debug: create_ivi_valid_surface completed successfully\n"); return TRUE; } else { return FALSE; } } // -------------------------- 向元素传递 Wayland 上下文(核心修复) -------------------------- static gboolean set_wayland_context_to_element(GstElement *element, struct wl_display *display) { if (!element || !display) { fprintf(stderr, "Error: Invalid element or display for GstContext\n"); return FALSE; } // 创建上下文 GstContext *context = gst_context_new(GST_CONTEXT_TYPE_WAYLAND_DISPLAY, TRUE); if (!context) { fprintf(stderr, "Error: Failed to create GstContext\n"); return FALSE; } // 设置上下文结构(display 字段) GstStructure *s = gst_context_writable_structure(context); gst_structure_set(s, "display", WL_TYPE_DISPLAY, display, NULL); // 直接向元素设置上下文(而非仅向 pipeline 设置) gst_element_set_context(element, context); printf("Debug: Set GstContext to element %s\n", GST_ELEMENT_NAME(element)); // 验证元素是否接收到上下文 GstContext *query_ctx = gst_element_get_context(element, GST_CONTEXT_TYPE_WAYLAND_DISPLAY); if (query_ctx) { const GstStructure *recv_struct = gst_context_get_structure(query_ctx); if (recv_struct) { const GValue *val = gst_structure_get_value(recv_struct, "display"); if (val && G_VALUE_HOLDS_BOXED(val)) { const struct wl_display *recv_display = g_value_get_boxed(val); if (recv_display == display) { printf("Debug: Element %s received display handle (verified)\n", GST_ELEMENT_NAME(element)); gst_context_unref(query_ctx); gst_context_unref(context); return TRUE; } } } gst_context_unref(query_ctx); } fprintf(stderr, "Warning: Element %s did not receive valid display handle\n", GST_ELEMENT_NAME(element)); gst_context_unref(context); return FALSE; } // -------------------------- 主函数 -------------------------- int main(int argc, char *argv[]) { GstElement *pipeline = NULL; GstElement *videosink = NULL; GstBus *bus = NULL; GstMessage *msg = NULL; GstStateChangeReturn ret; const char *video_path = NULL; char *abs_path = NULL; gchar *video_uri = NULL; int exit_code = EXIT_SUCCESS; setlocale(LC_ALL, "C"); gst_init(&argc, &argv); printf("GStreamer initialized: %s (SA8538 IVI-Shell compatible)\n", gst_version_string()); if (argc < 2) { fprintf(stderr, "Usage: %s <video_file_path>\n", argv[0]); return EXIT_FAILURE; } video_path = argv[1]; printf("Video to play: %s\n", video_path); if (!check_layermanager()) { return EXIT_FAILURE; } abs_path = realpath(video_path, NULL); if (!abs_path) { fprintf(stderr, "Error: Invalid video path\n"); return EXIT_FAILURE; } printf("Resolved absolute path: %s\n", abs_path); const char *xdg_runtime = getenv("XDG_RUNTIME_DIR"); const char *wayland_display = getenv("WAYLAND_DISPLAY"); if (!xdg_runtime || !wayland_display) { fprintf(stderr, "Error: Wayland env missing\n"); free(abs_path); return EXIT_FAILURE; } char *wayland_socket = safe_path_join(xdg_runtime, wayland_display); if (!wayland_socket || access(wayland_socket, F_OK) != 0) { fprintf(stderr, "Error: Wayland socket not found\n"); free(wayland_socket); free(abs_path); return EXIT_FAILURE; } printf("Wayland env validated: socket=%s\n", wayland_socket); free(wayland_socket); wl_display = wl_display_connect(NULL); if (!wl_display) { fprintf(stderr, "Error: Failed to connect Wayland Display\n"); free(abs_path); return EXIT_FAILURE; } wl_registry = wl_display_get_registry(wl_display); wl_registry_add_listener(wl_registry, &registry_listener, NULL); wl_display_roundtrip(wl_display); if (!wl_compositor || !ivi_app || !wl_shm) { fprintf(stderr, "Error: Missing required Wayland interfaces\n"); free(abs_path); goto cleanup_wayland; } if (!create_ivi_valid_surface()) { fprintf(stderr, "Error: Create valid IVI Surface failed\n"); free(abs_path); goto cleanup_wayland; } printf("Debug: Entering pipeline creation step...\n"); // 创建 pipeline pipeline = gst_element_factory_make("playbin", "video_pipeline"); if (!pipeline) { fprintf(stderr, "FATAL: Failed to create playbin pipeline\n"); free(abs_path); goto cleanup_wayland; } printf("Debug: Pipeline created (ptr: %p)\n", pipeline); // 创建 waylandsink 并直接向其传递上下文(核心修复) videosink = gst_element_factory_make("waylandsink", "video_sink"); if (!videosink) { fprintf(stderr, "FATAL: Failed to create waylandsink\n"); free(abs_path); goto cleanup_gst; } printf("Debug: Waylandsink created (ptr: %p)\n", videosink); // 关键:向 waylandsink 直接传递 display 上下文 if (!set_wayland_context_to_element(videosink, wl_display)) { fprintf(stderr, "ERROR: Failed to set display context to waylandsink - will not use external surface\n"); goto cleanup_gst; } // 绑定外部 wl_surface 到 waylandsink if (!wayland_surface) { fprintf(stderr, "FATAL: wayland_surface is NULL\n"); goto cleanup_gst; } gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(videosink), (guintptr)wayland_surface); // 额外设置属性,减少自动创建 surface 的概率 g_object_set(G_OBJECT(videosink), "sync", TRUE, "force-aspect-ratio", FALSE, // 禁用强制比例,避免 surface 重建 NULL); g_object_set(G_OBJECT(pipeline), "video-sink", videosink, NULL); printf("Debug: Bound waylandsink to wl_surface (ptr: %p)\n", wayland_surface); // 强制刷新 gst_video_overlay_expose(GST_VIDEO_OVERLAY(videosink)); printf("Debug: Sent expose event to waylandsink\n"); // 设置视频 URI video_uri = g_strconcat("file://", abs_path, NULL); free(abs_path); if (!video_uri) { fprintf(stderr, "Error: Invalid URI\n"); goto cleanup_gst; } g_object_set(G_OBJECT(pipeline), "uri", video_uri, NULL); printf("Video URI set: %s\n", video_uri); g_free(video_uri); // 启动播放 printf("Starting playback...\n"); ret = gst_element_set_state(pipeline, GST_STATE_READY); if (ret == GST_STATE_CHANGE_FAILURE) { fprintf(stderr, "Error: Failed to set pipeline to READY\n"); goto cleanup_gst; } usleep(500000); ret = gst_element_set_state(pipeline, GST_STATE_PLAYING); if (ret == GST_STATE_CHANGE_FAILURE) { fprintf(stderr, "Error: Failed to start playback\n"); goto cleanup_gst; } // 绑定图层 if (!setup_layer_and_surface(videosink_surface_id)) { exit_code = EXIT_FAILURE; goto cleanup_gst; } // 主消息循环 bus = gst_element_get_bus(pipeline); if (!bus) { fprintf(stderr, "Error: Get GStreamer bus failed\n"); exit_code = EXIT_FAILURE; goto cleanup_gst; } printf("Enter main loop (Ctrl+C to stop)...\n"); gboolean exit_loop = FALSE; while (!exit_loop) { msg = gst_bus_timed_pop(bus, 10 * GST_MSECOND); if (msg) { switch (GST_MESSAGE_TYPE(msg)) { case GST_MESSAGE_EOS: printf("Playback completed (EOS)\n"); exit_loop = TRUE; break; case GST_MESSAGE_ERROR: { GError *err; gchar *debug; gst_message_parse_error(msg, &err, &debug); fprintf(stderr, "GStreamer Error: %s (debug: %s)\n", err->message, debug); g_error_free(err); g_free(debug); exit_loop = TRUE; exit_code = EXIT_FAILURE; break; } default: break; } gst_message_unref(msg); } wl_display_dispatch_pending(wl_display); usleep(10000); } gst_object_unref(bus); cleanup_gst: cleanup_layer_and_surface(); if (videosink) gst_object_unref(videosink); if (pipeline) { gst_element_set_state(pipeline, GST_STATE_NULL); gst_object_unref(pipeline); } cleanup_wayland: if (ivi_surface) ivi_surface_destroy(ivi_surface); if (wayland_surface) wl_surface_destroy(wayland_surface); if (dummy_buffer) wl_buffer_destroy(dummy_buffer); if (ivi_app) ivi_application_destroy(ivi_app); if (wl_shm) wl_shm_destroy(wl_shm); if (wl_registry) wl_registry_destroy(wl_registry); if (wl_compositor) wl_compositor_destroy(wl_compositor); if (wl_display) wl_display_disconnect(wl_display); printf("Exiting with code: %d\n", exit_code); return exit_code; }
08-28
(gdb) bt #0 lv_obj_get_ext_draw_size (obj=obj@entry=0x0) at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/core/lv_obj_draw.c:313 #1 0x0004f490 in lv_obj_invalidate (obj=obj@entry=0x0) at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/core/lv_obj_pos.c:847 #2 0x0002fc50 in lv_label_set_text (obj=0x0, text=0xbeeca03c "2025-11-12") at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/widgets/label/lv_label.c:147 #3 0x000c9ebe in tp_lv_time_picker_set_show_time_only (obj=0x4dfd4c <work_mem_int+2506536>, time=<optimized out>) at TpTimePicker.c:341 #4 0x0014d274 in update_time_str_label (obj=obj@entry=0x460324 <work_mem_int+1983744>) at PlaybackBar.c:3961 #5 0x001514b4 in tp_lv_timebar_event_cb (class_p=<optimized out>, e=<optimized out>) at PlaybackBar.c:2268 #6 tp_lv_timebar_event_cb (class_p=<optimized out>, e=<optimized out>) at PlaybackBar.c:2216 #7 0x000481cc in lv_obj_event_base (class_p=<optimized out>, e=e@entry=0xbeeca2ac) at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/core/lv_obj_event.c:89 #8 0x00048242 in event_send_core (e=e@entry=0xbeeca2ac) at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/core/lv_obj_event.c:364 #9 0x0004833e in lv_obj_send_event (obj=<optimized out>, event_code=<optimized out>, param=param@entry=0x0) at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/core/lv_obj_event.c:67 #10 0x001edc4c in playbackimp_chn_list_change_task_cb (task=<optimized out>) at PlaybackImp.c:689 #11 0x001a53cc in async_task_finish_process (arg=0x3d3bb8 <work_mem_int+1408404>) at TpAsyncTaskQueue.c:994 #12 0x001c45e2 in tp_sync_timer (timer=<optimized out>) at AppInit.c:757 #13 0x0003fadc in lv_timer_exec (timer=0x3aff24 <work_mem_int+1261824>) at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/misc/lv_timer.c:326 #14 lv_timer_handler () at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/misc/lv_timer.c:107 #15 lv_timer_handler () at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/lvgl/src/misc/lv_timer.c:63 #16 0x00015758 in main () at /home/xiejikai/24q3/torchlight/build_dir/target-arm-openwrt-linux-uclibcgnueabihf/nvrgui_lvgl/main.c:75 (gdb) p *(tp_lv_time_picker_t *)0x4dfd4c $10 = {obj = {class_p = 0x27be24 <work_mem_int>, parent = 0x27be24 <work_mem_int>, spec_attr = 0x0, styles = 0x0, style_main_prop_is_set = 2611476, style_other_prop_is_set = 56, user_data = 0x0, id = 0x0, coords = {x1 = 391857407, y1 = 0, x2 = 16777215, y2 = 0}, flags = -16777216, state = 64836, layout_inv = 1, readjust_scroll_after_layout = 0, scr_layout_inv = 1, skip_trans = 1, style_cnt = 4, h_layout = 0, w_layout = 0, is_deleting = 0}, ta = 0x57, popup = 0x3d72d0 <work_mem_int+1422508>, header = 0x1, year_label = 0x717, month_label = 0x3de, calendar = 0x739, time_cont = 0x3e8, hms_selector = 0x717, footer = 0x3de, year_picker = 0x739, month_picker = 0x3e8, hms_picker = 0x0, show_label = 0x0, icon = 0x0, showed_date = {year = 0, month = 0 '\000', day = 0 '\000'}, selected_date = {year = 812, month = 0 '\000', day = 0 '\000'}, origin_date = {year = 0, month = 0 '\000', day = 0 '\000'}, clicked_date = {year = 0, month = 0 '\000', day = 0 '\000'}, date_format = 1079, hour_format = (TP_HOUR_FORMAT_12 | unknown: 2), hour = 224 '\340', minute = 253 '\375', second = 77 'M', origin_hour = 224 '\340', origin_minute = 253 '\375', origin_second = 77 'M', am_pm = 77 'M', content_cont = 0x3b, year_grid_btn = {0x430384 <work_mem_int+1787232>, 0x27be24 <work_mem_int>, 0x0, 0x0, 0x27d914 <work_mem_int+6896>, 0x38, 0x0, 0x0, 0x175b44ff, 0x0, 0xffffff <work_mem_int+14172635>, 0x0}, month_grid_btn = {0xff000000, 0x4dfd44 <work_mem_int+2506528>, 0x57, 0x3c3ce0 <work_mem_int+1343164>, 0x1, 0x48f, 0x3de, 0x48f, 0x3e8, 0x48f, 0x3de, 0x48f}, is_calendar = 232} (gdb) p tp_timebar $11 = (tp_lv_timebar_t *) 0x460324 <work_mem_int+1983744> (gdb) p g_playback_timebar_obj $12 = (lv_obj_t *) 0x460324 <work_mem_int+1983744> (gdb) p (tp_lv_timebar_t *) 0x460324 $13 = (tp_lv_timebar_t *) 0x460324 <work_mem_int+1983744> (gdb) p *(tp_lv_timebar_t *) 0x460324 $14 = {obj = {class_p = 0x23fd60 <tp_lv_timebar_class>, parent = 0x420dd8 <work_mem_int+1724340>, spec_attr = 0x3daba8 <work_mem_int+1437060>, styles = 0x3c6ff4 <work_mem_int+1356240>, style_main_prop_is_set = 65551, style_other_prop_is_set = 0, user_data = 0x606f50 <work_mem_int+3715372>, id = 0x971, coords = {x1 = 280, y1 = 864, x2 = 1919, y2 = 1079}, flags = 64358, state = 0, layout_inv = 0, readjust_scroll_after_layout = 0, scr_layout_inv = 0, skip_trans = 0, style_cnt = 1, h_layout = 0, w_layout = 0, is_deleting = 0}, ctrl_obj = 0x3dab6c <work_mem_int+1437000>, chn_name_obj = 0x3cc31c <work_mem_int+1377528>, video_info_obj = 0x3cc224 <work_mem_int+1377280>, bottom_ctrl_obj = 0x3e2ee8 <work_mem_int+1470660>, play_obj = 0x3d56a8 <work_mem_int+1415300>, single_frame_obj = 0x3d57e0 <work_mem_int+1415612>, speed_obj = 0x4449bc <work_mem_int+1870744>, smartspeed_obj = 0x4b7560 <work_mem_int+2340668>, cut_obj = 0x4810d4 <work_mem_int+2118320>, export_obj = 0x4f30d4 <work_mem_int+2585264>, export_label_obj = 0x52bcf8 <work_mem_int+2817748>, scale_obj = 0x42b620 <work_mem_int+1767420>, people_obj = 0x46771c <work_mem_int+2013432>, vehicle_obj = 0x46788c <work_mem_int+2013800>, pet_obj = 0x4679bc <work_mem_int+2014104>, cut_begin_obj = 0x0, cut_end_obj = 0x0, b30_obj = 0x42a540 <work_mem_int+1763100>, calendar_obj = 0x4dfd4c <work_mem_int+2506536>, f30_obj = 0x3d4f8c <work_mem_int+1413480>, hq_obj = 0x467acc <work_mem_int+2014376>, audio_obj = 0x42a260 <work_mem_int+1762364>, zoom_obj = 0x425244 <work_mem_int+1741856>, screennum_obj = 0x0, fullscreen_obj = 0x3cc104 <work_mem_int+1376992>, save_clip_btn_obj = 0x0, continuous_rec_obj = 0x3e2f7c <work_mem_int+1470808>, event_rec_obj = 0x463448 <work_mem_int+1996324>, expend_obj = 0x4dec60 <work_mem_int+2502204>, clear_obj = 0x3e3378 <work_mem_int+1471828>, tip_label = 0x0, play_state = 0, scale_select_idx = 0, scale_idx = 28, scale = 1440, start_time = 1762833600, cur_time = 1762876800, disp_time_gap = 120, time_clip = 12, pressing = 0, volume_val = 0, speed_index = 4, scrollbar_pos = 0, hq_index = 0, pressed_point = {x = 0, y = 0}, last_point = {x = 0, y = 0}, disp_time_label = {0x429158 <work_mem_int+1758004>, 0x429250 <work_mem_int+1758252>, 0x429348 <work_mem_int+1758500>, 0x429444 <work_mem_int+1758752>, 0x466338 <work_mem_int+2008340>, 0x46640c <work_mem_int+2008552>, 0x466514 <work_mem_int+2008816>, 0x466610 <work_mem_int+2009068>, 0x46670c <work_mem_int+2009320>, 0x46680c <work_mem_int+2009576>, 0x478364 <work_mem_int+2082112>, 0x47843c <work_mem_int+2082328>, 0x478538 <work_mem_int+2082580>, 0x478638 <work_mem_int+2082836>, 0x47873c <work_mem_int+2083096>, 0x478838 <work_mem_int+2083348>}, hover_time_obj = 0x462d38 <work_mem_int+1994516>, chn_label = {0x3cc3c8 <work_mem_int+1377700>, 0x3cc500 <work_mem_int+1378012>, 0x3cc5f8 <work_mem_int+1378260>, 0x42905c <work_mem_int+1757752>}, scrollbar_obj = 0x4def7c <work_mem_int+2503000>, show_scrollbar = 1, chn_num = 8, show_chn_idx = 0, expend = 1, mode = 0, stop_update_time = 0, cur_chn = 0, full_show = 0, export_slice_num = 0, cut_setting_time = 0, left_cut_bar_hoverd = false, right_cut_bar_hoverd = false, left_cut_bar_area = {x1 = 0, y1 = 0, x2 = 0, y2 = 0}, right_cut_bar_area = {x1 = 0, y1 = 0, x2 = 0, y2 = 0}} (gdb) p tp_timebar $15 = (tp_lv_timebar_t *) 0x460324 <work_mem_int+1983744> (gdb) p tp_timebar->ctrl_obj $16 = (lv_obj_t *) 0x3dab6c <work_mem_int+1437000> (gdb) p *(lv_obj_t *) A syntax error in expression, near `'. (gdb) p *(lv_obj_t *) A syntax error in expression, near `'. (gdb) p *(lv_obj_t *)0x460324 $17 = {class_p = 0x23fd60 <tp_lv_timebar_class>, parent = 0x420dd8 <work_mem_int+1724340>, spec_attr = 0x3daba8 <work_mem_int+1437060>, styles = 0x3c6ff4 <work_mem_int+1356240>, style_main_prop_is_set = 65551, style_other_prop_is_set = 0, user_data = 0x606f50 <work_mem_int+3715372>, id = 0x971, coords = {x1 = 280, y1 = 864, x2 = 1919, y2 = 1079}, flags = 64358, state = 0, layout_inv = 0, readjust_scroll_after_layout = 0, scr_layout_inv = 0, skip_trans = 0, style_cnt = 1, h_layout = 0, w_layout = 0, is_deleting = 0} (gdb) p *(lv_obj_t *) 0x3dab6c $18 = {class_p = 0x21e488 <lv_obj_class>, parent = 0x460324 <work_mem_int+1983744>, spec_attr = 0x3dac98 <work_mem_int+1437300>, styles = 0x3dabe8 <work_mem_int+1437124>, style_main_prop_is_set = 232015, style_other_prop_is_set = 4111, user_data = 0x0, id = 0x1c42aa <tp_lv_muti_dropdown_set_select+18>, coords = {x1 = 280, y1 = 864, x2 = 1903, y2 = 918}, flags = 64358, state = 0, layout_inv = 0, readjust_scroll_after_layout = 0, scr_layout_inv = 0, skip_trans = 0, style_cnt = 4, h_layout = 1, w_layout = 1, is_deleting = 0} (gdb) f 5 #5 0x001514b4 in tp_lv_timebar_event_cb (class_p=<optimized out>, e=<optimized out>) at PlaybackBar.c:2268 2268 update_time_str_label(obj); (gdb) tp_timebar->chn_num Undefined command: "tp_timebar->chn_num". Try "help". (gdb) p tp_timebar->chn_num $19 = 8 (gdb) p tp_timebar->calendar_obj $20 = (lv_obj_t *) 0x4dfd4c <work_mem_int+2506536> (gdb) p *(lv_obj_t *) 0x4dfd4c $21 = {class_p = 0x27be24 <work_mem_int>, parent = 0x27be24 <work_mem_int>, spec_attr = 0x0, styles = 0x0, style_main_prop_is_set = 2611476, style_other_prop_is_set = 56, user_data = 0x0, id = 0x0, coords = {x1 = 391857407, y1 = 0, x2 = 16777215, y2 = 0}, flags = -16777216, state = 64836, layout_inv = 1, readjust_scroll_after_layout = 0, scr_layout_inv = 1, skip_trans = 1, style_cnt = 4, h_layout = 0, w_layout = 0, is_deleting = 0} (gdb) p *(lv_obj_t *)0x27be24 $22 = {class_p = 0x0, parent = 0x0, spec_attr = 0x4deff8 <work_mem_int+2503124>, styles = 0x3cc4d8 <work_mem_int+1377972>, style_main_prop_is_set = 1050623, style_other_prop_is_set = 3271562920, user_data = 0xf399dbff, id = 0x35c7bdff, coords = {x1 = -1589395569, y1 = 1596, x2 = 385884183, y2 = 604013289}, flags = 8200, state = 129, layout_inv = 1, readjust_scroll_after_layout = 0, scr_layout_inv = 0, skip_trans = 0, style_cnt = 0, h_layout = 0, w_layout = 0, is_deleting = 0} (gdb) x/16xw 0x4dfd4c 0x4dfd4c <work_mem_int.12761+2506536>: 0x0027be24 0x0027be24 0x00000000 0x00000000 0x4dfd5c <work_mem_int.12761+2506552>: 0x0027d914 0x00000038 0x00000000 0x00000000 0x4dfd6c <work_mem_int.12761+2506568>: 0x175b44ff 0x00000000 0x00ffffff 0x00000000 0x4dfd7c <work_mem_int.12761+2506584>: 0xff000000 0x004dfd44 0x00000057 0x003d72d0 帮我分析上述调用栈
11-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值