设置断点追踪entry_point

[root@ce66c469-721d-41bf-9f6d-73187d2c6410 log]# ps -ef | grep scal
root      2518     1  0 16:26 ?        00:00:00 /opt/scalarizr/embedded/bin/python /opt/scalarizr/bin/scalr-upd-client --daemonize --pid-file /var/run/scalr-upd-client.pid --log-file /var/log/scal rizr_update.log
root      2596     1  0 16:26 ?        00:00:01 /opt/scalarizr/embedded/bin/python /usr/bin/scalarizr -z -c /etc/scalr
root      2661  2462  0 16:32 pts/0    00:00:00 grep --color=auto scal
[root@ce66c469-721d-41bf-9f6d-73187d2c6410 log]# which scalr-upd-client
/usr/bin/scalr-upd-client
[root@ce66c469-721d-41bf-9f6d-73187d2c6410 log]# vim /usr/bin/scalr-upd-client

vim 打开文件后 遇到entry_point 无法继续追踪

#!/opt/scalarizr/embedded/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'scalarizr==4.9.2','console_scripts','scalr-upd-client'
__requires__ = 'scalarizr==4.9.2'
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.exit(
        load_entry_point('scalarizr==4.9.2', 'console_scripts', 'scalr-upd-client')()
    )
"/usr/bin/scalr-upd-client" 10L, 344C                         1,1           All

加入断点追踪

if __name__ == '__main__':
    import pdb
    pdb.set_trace()
    load_entry_point('scalarizr==4.9.2', 'console_scripts', 'scalr-upd-client')()

然后运行ps 中的命令 去掉deamonize进入调试模式,所有(Pdb)后面的都是需要输入的部分

[root@ce66c469-721d-41bf-9f6d-73187d2c6410 log]# /opt/scalarizr/embedded/bin/python /opt/scalarizr/bin/scalr-upd-client --pid-file /var/run/scalr-upd-client.pid --log-file /var/log/scal rizr_update.log
> /opt/scalarizr/bin/scalr-upd-client(10)<module>()
-> load_entry_point('scalarizr==4.9.2', 'console_scripts', 'scalr-upd-client')()
(Pdb) s
--Call--
> /opt/scalarizr/embedded/lib/python2.7/site-packages/setuptools-18.0.1-py2.7.egg/pkg_resources/__init__.py(556)load_entry_point()
-> def load_entry_point(dist, group, name):
(Pdb) s
> /opt/scalarizr/embedded/lib/python2.7/site-packages/setuptools-18.0.1-py2.7.egg/pkg_resources/__init__.py(558)load_entry_point()
-> return get_distribution(dist).load_entry_point(group, name)
(Pdb) s
--Call--
> /opt/scalarizr/embedded/lib/python2.7/site-packages/setuptools-18.0.1-py2.7.egg/pkg_resources/__init__.py(546)get_distribution()
-> def get_distribution(dist):
(Pdb) r
--Return--
> /opt/scalarizr/embedded/lib/python2.7/site-packages/setuptools-18.0.1-py2.7.egg/pkg_resources/__init__.py(554)get_distribution()->scalariz...y2.7.egg)
-> return dist
(Pdb) p(dist._provider.egg_info)
'/opt/scalarizr/embedded/lib/python2.7/site-packages/scalarizr-4.9.2-py2.7.egg/EGG-INFO'

在过程中返回了dist,然后读取它的egg_info,可以看到所在路径。

[root@314a4202-26e0-4adc-a745-d2e690459a37 ~]# vim /opt/scalarizr/embedded/lib/python2.7/site-packages/scalarizr-4.9.2-py2.7.egg/EGG-INFO/entry_points.txt

vim打开该文件

[console_scripts]
scalarizr = scalarizr.app:main
scalr-upd-client = scalarizr.updclient.app:main
szradm = scalarizr.adm.app:main


~
<calarizr-4.9.2-py2.7.egg/EGG-INFO/entry_points.txt" 5L, 130C 1,1           All

因为要找scalr-upd-client所以去找 scalarizr.updclient.app:main 函数,也在刚才的文件夹下。

[root@314a4202-26e0-4adc-a745-d2e690459a37 ~]# cd /opt/scalarizr/embedded/lib/python2.7/site-packages/scalarizr-4.9.2-py2.7.egg/scalarizr/
[root@314a4202-26e0-4adc-a745-d2e690459a37 scalarizr]# ls
adm          cacert.pem      __init__.pyc  queryenv.pyc  storage2
api          config.py       libs          rpc.py        updclient
app.py       config.pyc      linux         rpc.pyc       util
app.pyc      exceptions.py   messaging     scripts       version
bollard.py   exceptions.pyc  node.py       service.py
bollard.pyc  externals       node.pyc      service.pyc
bus.py       handlers        platform      services
bus.pyc      __init__.py     queryenv.py   storage
[root@314a4202-26e0-4adc-a745-d2e690459a37 scalarizr]# cd updclient
[root@314a4202-26e0-4adc-a745-d2e690459a37 updclient]# ls
api.py   app.py   __init__.py   pkgmgr.py
api.pyc  app.pyc  __init__.pyc  pkgmgr.pyc
[root@314a4202-26e0-4adc-a745-d2e690459a37 updclient]# vim app.py

文件绝对路径为 /opt/scalarizr/embedded/lib/python2.7/site-packages/scalarizr-4.9.2-py2.7.egg/scalarizr/updclient/app.py
用vim打开,找到main函数。

def main():
    if linux.os.windows_family \
            and not ('--make-status-file' in sys.argv or '--get-system-id' in sys.argv):
        win32serviceutil.HandleCommandLine(WindowsService)
    else:
        svs = UpdClient()
        try:
            svs.serve_forever()
        except KeyboardInterrupt:
            pass

    # svs = UpdClient()
    # try:
    #     svs.serve_forever()
    # except KeyboardInterrupt:
    #     svs.stop()
"/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "cmsis_os.h" #include "can.h" #include "dma.h" #include "usart.h" #include "gpio.h" #include "chassis.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "bsp_can.h" #include "pid.h" #include "chassis_task.h" #include "bsp_rc.h" #include "outctl_task.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); void MX_FREERTOS_Init(void); /* USER CODE BEGIN PFP */ void BSP_All_Init(void); /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_CAN1_Init(); MX_USART1_UART_Init(); MX_USART3_UART_Init(); MX_USART6_UART_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Call init function for freertos objects (in cmsis_os2.c) */ MX_FREERTOS_Init(); /* Start scheduler */ osKernelStart(); /* We should never get here as control is now taken by the scheduler */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 25; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } } /* USER CODE BEGIN 4 */ void BSP_All_Init(void) // ?????????????? { // uint8_t i=0; // ???? extern uint8_t aTxVisionMessages[22]; //delay_init(); CAN_FilterInit(&hcan1); // ?????CAN1?????? PID_Init(&PID_HEAT_PWM,POSITION_PID,1000,1000,1600,0.2,0,0,0); //client_state_now.motion = 0; //client_state_past.motion = 1; } /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ “这是我的代码,我现在的问题是,当我选择debug模式去观测一些值的时候,发现程序没有进入"void BSP_All_Init(void)"这个函数
最新发布
06-28
<think>嗯,用户遇到了一个C语言调试问题:程序运行时没有进入指定的BSP_All_Init函数。这个问题很典型,需要系统性地排查。用户提供的调试信息很有价值,特别是那个包含__FILE__和__LINE__宏的引用[^1]。这说明用户已经在用位置追踪宏了,但奇怪的是连初始化函数的入口都没触发。从经验看,这类问题通常有四个关键排查方向:首先是函数调用路径问题。用户需要确认main函数是否确实调用了BSP_All_Init。这里有个细节:如果函数声明和定义不一致(比如参数列表不同),编译器可能不会报错而是隐式转换,导致调用失败。建议用户检查编译日志里的warning。第二是链接问题值得重点关注。用户可能修改了函数名但忘记重新编译相关模块?或者存在多个同名函数导致链接器选错了实现?引用[^2]提到的模块初始化机制就与此相关。建议用户检查map文件里该函数的实际地址。第三是执行流异常。用户程序可能在BSP_All_Init之前就崩溃了。比如全局变量初始化时触发硬件异常,或者静态对象构造函数出错。引用[^3]提到的串口初始化失败案例就很典型——如果UART初始化依赖的时钟配置错误,程序会死在初始化前。 最后是编译器优化陷阱。如果BSP_All_Init被标记为static且仅被某些条件编译块调用,激进优化可能会直接删除该函数。建议用户临时关闭优化测试。 特别要注意的是,用户代码片段里有个while(1)死循环[^1]。如果这个循环出现在BSP_All_Init之前的初始化流程中,自然就卡住了。建议用户用调试器检查程序计数器(PC)的位置。准备在回复中给出具体排查步骤:从最简单的断点调试开始,逐步深入到反汇编和栈回溯分析。每个步骤都给出验证方法,比如查看map文件的函数地址映射,或者用objdump检查符号表。考虑到用户正在调试,相关建议会聚焦在可操作的技术点上:如何设置硬件断点,怎么检查链接脚本,为何要验证中断向量表。对于嵌入式开发,这些底层检查往往能快速定位问题。</think>在C语言调试中程序未进入`void BSP_All_Init(void)`函数,可能原因及排查步骤如下: --- ### **1. 函数未被调用** - **直接原因**:代码中未调用该函数 **验证方法**: 1. 在`main()`函数中搜索`BSP_All_Init()`的调用语句 2. 检查条件编译宏(如`#ifdef DEBUG`)是否屏蔽了调用 3. 确认函数名拼写一致(区分大小写) --- ### **2. 链接问题** - **符号未链接**:函数未包含在最终可执行文件中 **排查步骤**: 1. 检查`.map`文件(链接脚本生成)中是否存在`BSP_All_Init`符号 2. 确认包含该函数的源文件已加入编译列表 3. 若函数在静态库中,检查库是否被正确链接 --- ### **3. 执行流被中断** - **硬件/软件异常**:在调用前程序已崩溃 **典型场景**: - 全局变量初始化时触发硬件故障(如访问非法地址) - 中断向量表配置错误导致复位 - 栈溢出(常见于中断嵌套或大局部变量) **调试方法**: 1. 在`main()`函数**第一行**添加调试语句(如`printf`或断点)[^1] ```c int main(void) { dbg_Info_print(__FILE__, __FUNCTION__, __LINE__); // 验证入口点 BSP_All_Init(); // 应在此后调用 // ... } ``` 2. 检查HardFault等异常处理函数是否被触发 --- ### **4. 编译器优化干扰** - **优化级别过高**:函数调用被优化掉 **解决方案**: 1. 临时关闭编译器优化(如GCC的`-O0`选项) 2. 为函数添加`__attribute__((used))`(GCC)或`#pragma optimize off` --- ### **5. 函数签名不匹配** - **声明与定义不一致**:导致链接器忽略函数 **示例错误**: ```c // 声明: void BSP_All_Init(); // 错误!未指定void参数 // 正确定义: void BSP_All_Init(void); ``` **验证**:确保头文件中的声明包含`(void)`而非`()`。 --- ### **6. 依赖模块未初始化** - **前置条件失败**: 若`BSP_All_Init()`依赖其他初始化函数(如时钟配置),其失败可能导致跳过后续逻辑。 **调试建议**: 在调用链的每个函数入口添加跟踪点[^1]: ```c void Clock_Init(void) { dbg_Info_print(__FILE__, __func__, __LINE__); // 跟踪执行流 // ... } ``` --- ### **排查工具建议** | **工具** | **用途** | |-------------------|----------------------------------| | 调试器(GDB/J-Link) | 设置断点,单步跟踪执行流 | | `nm`或`objdump` | 检查二进制文件中是否存在函数符号 | | 链接脚本(.ld) | 确认代码段是否正确映射到内存 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值