Parameters: Invalid chunk '' ignored.

本文详细解析了在使用Tomcat过程中遇到的“Parameters: Invalid chunk ignored”警告的原因,并提供了有效的解决方案。通过分析不同版本和配置下的表现,指出不规范的参数传递可能导致的问题。

不同版本的原因,都那过来研究一下:

造成以上问题的有这么几种原因:
1、访问/test.jsp?&p1=1&p2=2...
2、访问/test.jsp?p1=1&p2=&p3=3...
3、访问/test.jsp?p1=1&&p2=2...
4、访问/test.jsp?action=save&....
5、表单提交时,存在<input name="" value="***" />这样的域

总之,代码编写的不规范容易带来这样的问题。

 

   原因分析之一:你提交后面(*.jsp?param1=1&param2=2&&param3=3)的参数跟随过多的&&符号,
超过两个以上,tomcat5.5及版本以上它可能会不识别你给的参数,认为是你的参数非法无效的有大块的,并且可以忽略掉多余的,只是作为警告警示你有非法字符参数传递,一般来说不会影响你的应用程序程序运行,但是我们建议尽量避免这种多余参数的出现。这就是Apache组织在版本升级时,增加应用功能的校验,一些的非法的参数输入格式会提示警告你,有些原因可能被认为是你传入的参数,在对应的页面没有request.getParameter("param")使用到这个参数,既然你传入了,但你又没使用,所以警告提示你需要去掉多余的参数传递;

       原因分析之二:jdk版本不同跟应用服务器配置的相应变化,一起做了参数功能校验设置。

 

      也就是说参数的传递尽量的规范化,不能随意撰写,可能会出现你想不到的异常或者警告等。

 

举个例子:url?&key=value
这里的&就代表一个无效的参数。正确的应该是url?key1=value1&key2=value2
或者url?key=value 。

这个警告应该不会引起线程挂掉的,很可能是tomcat或你的应用本身有性能瓶颈。服务器会过滤这种无效参数,要找这个警告的源头是不容易,但也不是没办法。你需要写一个url有效性的检查的方法,然后写一个过滤器,把这个过滤器配置为对有所url进行过滤,然后发现有问题的url就打印或写入日志。

 

 Jun 252007 10:34:54 PM org.apache.tomcat.util.http.Parameters processParameters
2  WARNING: Parameters: Invalid chunk ignored.

相信很多人,在使用Tomcat中碰到过上面这个问题。我也为此苦恼过。现将解决办法,告诉大家及解决问题的一点感悟。
数次碰到这个问题没有解决后,促使我想到去看原代码,根据异常信息,我找到抛出异常的代码段。现将原代码引入到文章中。
 1 if( nameEnd<=nameStart ) {
 2                 StringBuilder msg = new StringBuilder("Parameters: Invalid chunk ");
 3                 // No name eg &=xx& will trigger this
 4                 if (valEnd >= nameStart) {
 5                     msg.append('/'');
 6                     try {
 7                         msg.append(new String(bytes, nameStart,
 8                                 valEnd - nameStart, DEFAULT_ENCODING));
 9                     } catch (UnsupportedEncodingException e) {
10                         // Should never happen
11                         log.error("Unable to convert bytes", e);
12                     }
13                     msg.append("");
14                 }
15                 msg.append("ignored.");
16                 log.warn(msg);
17                 continue;
18                 // invalid chunk - it's better to ignore
19             }
不知你注意到没,我在上面代码第3行的注释上,加上了下划线,相信你看到这句话时,知道应该做了。
对了,你猜对了。没有参数名称(例如,&=xx&aa=11),每个&后面没有参数名称,这样的情况发生后,将
触发这个异常。

注:这同样告诉我们一个问题。对于开源项目,如果你在搜索现有资料不能解决问题时,你可以尝试去看原代码,或许可以找到解决问题的办法。

 

在C/C++程序中,`munmap_chunk(): invalid pointer`、`segmentation fault`(段错误)以及 `double free or corruption`(双重释放或损坏)是常见的运行时内存管理错误。这些错误通常与指针的使用不当有关,涉及动态内存分配、释放及访问越界等操作。 ### 1. `munmap_chunk(): invalid pointer` 错误分析 该错误通常发生在调用 `free()` 或 `realloc()` 时传递了无效指针。`munmap_chunk()` 是 `glibc` 内部用于释放内存块的函数,当传入的指针不是由 `malloc()`、`calloc()` 或 `realloc()` 返回的有效指针时,就会触发此错误。常见原因包括: - **指针未初始化**:对未初始化的指针调用 `free()`。 - **指针被修改**:在 `malloc()` 或 `calloc()` 后,指针被移动或修改,导致最终释放的是非原始地址。 - **重复释放**:同一指针被多次释放,即“双重释放”问题[^2]。 - **栈内存释放**:尝试释放局部变量或非堆内存上的指针。 示例代码如下: ```c int *ptr = malloc(sizeof(int) * 10); ptr++; // 修改原始指针 free(ptr); // 错误:释放非法指针 ``` ### 2. 段错误(Segmentation Fault) 段错误通常是由于访问了未授权的内存区域。常见原因包括: - **解引用空指针或野指针**:如 `NULL` 指针或已被释放但仍被使用的指针。 - **数组越界访问**:超出分配的内存范围读写数据。 - **返回局部变量的指针**:函数返回后局部变量的内存已被回收,外部继续访问将导致不可预测行为。 示例代码如下: ```c int *dangerous_function() { int value = 42; return &value; // 返回局部变量地址 } ``` ### 3. 双重释放或内存损坏(Double Free or Corruption) 该错误表示尝试释放已经被释放的内存块,或者内存内容在释放前已被破坏。这可能导致程序崩溃或安全漏洞。常见原因包括: - **多个线程同时操作同一指针**而未加锁。 - **手动修改内存块元数据**,例如覆盖了 `malloc` 管理结构。 - **使用 `memcpy` 或 `strcpy` 时缓冲区溢出**。 示例代码如下: ```c char *buffer = malloc(16); strcpy(buffer, "This string is way too long for the buffer"); // 缓冲区溢出 free(buffer); // 可能触发 double free or corruption ``` --- ### 调试与解决方法 为排查此类问题,可以采取以下措施: - 使用 `valgrind` 工具检测内存泄漏、非法访问和释放问题: ```bash valgrind --leak-check=full ./your_program ``` - 启用 `gdb` 进行核心转储调试,定位具体出错位置: ```bash gdb ./your_program core ``` - 避免直接操作原始指针,优先使用智能指针(C++)或封装好的容器类。 - 在每次释放前检查指针是否为 `NULL`,并释放后将其置为 `NULL`: ```c if (ptr != NULL) { free(ptr); ptr = NULL; } ``` - 使用 `assert()` 对指针进行有效性检查,尤其是在关键路径上。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值